在命令结果bash中替换行的字符串

时间:2013-11-29 15:49:03

标签: bash email ldap

我有一个包含用户和ips列表的文件,标签分隔。我希望在此文件中用ldapsearch查询替换用户名的邮件。

我设法将ldapsearch结果放在一个很好的用户和邮件列表中,也是分隔符。

在bash中最简单的方法是什么?

示例输入

文件

name1<tab>ip1<tab>other stuff 1
name2<tab>ip2<tab>other stuff 2
...

Ldap输出

name1 (mail1)
name2 (mail2)
...

所需的输出(转换文件)

mail1<tab>ip1<tab>other stuff 1
mail2<tab>ip2<tab>other stuff 2
...

2 个答案:

答案 0 :(得分:2)

您可以使用join

$ cat file
name1   ip1 other stuff 1
name2   ip2 other stuff 2
$ cat ldapoutput 
name1 (mail1)
name2 (mail2)
$ join <(tr -d '()' < ldapoutput) file | cut -d ' ' -f 2-
mail1 ip1 other stuff 1
mail2 ip2 other stuff 2

以下更简单的版本会在每行留下名称:

$ join ldapoutput file 
name1 (mail1) ip1 other stuff 1
name2 (mail2) ip2 other stuff 2

请注意,输入文件的排序必须join才能生效。如果不是,您可以使用这样的结构:

$ join <(sort ldapoutput) <(sort file)

答案 1 :(得分:2)

你可以使用这个awk one-liner:

awk -F '[ \t()]' 'FNR==NR {a[$1]=$3;next} $1 in a{$1=a[$1]}1' OFS='\t' ldap file
mail1   ip1     other   stuff   1
mail2   ip2     other   stuff   2

将管道与cat -vte一起使用:

mail1^Iip1^Iother^Istuff^I1$
mail2^Iip2^Iother^Istuff^I2$