bash sed如何追加到行的开头,匹配行开头的变量

时间:2017-06-13 16:07:02

标签: bash sed

如果行的开头与变量中的servername匹配,我在查找如何在每行的开头追加时遇到一些麻烦。虽然很高兴但不是必需的,如果没有匹配的网站,则表示" unknown-site"在行的开头。

我确实有一个已知的每个站点的计算机名称列表。

site1="server1 server2 ..."
site2="server3 ..."

我认为代码应该像

for each servername in $site1 do; sed command in file
for each servername in $site2 do; sed command in file

提供给我的原始数据

server1 data1...
server1 data2...
server3 data3...
server3 data2...
server2 data4...
server3 data3...
server2 data5...

这应该是出局

site1 server1 data1...
site1 server1 data2...
site2 server3 data3...
site2 server3 data2...
site1 server2 data4...
site2 server3 data3...
site1 server2 data5...

2 个答案:

答案 0 :(得分:0)

如果您可以将服务器<>网站映射安排到一个文件(servers),如下所示:

server1 site1
server2 site1
server3 site2

然后使用awk

就可以了
$ awk 'FNR==NR {s[$1] = $2; next} {print s[$1], $0}' servers in
site1 server1 data1...
site1 server1 data2...
site2 server3 data3...
...

NRawk到目前为止看到的记录(行数),FNR此文件中显示的记录数量。将它们与FNR==NR进行比较是将第一个文件与其余文件分开的常用习惯用法。因此,对于第一个文件的每一行,我们将找到的值设置为数组s,第一个字段($1)作为键,第二个字段($2)作为值,然后跳转到next行。 (awk中的所有数组都是关联的,并且使用字符串作为键/索引。)现在,我们的站点名称与数组s中的服务器(例如s["server1"] == "site1")匹配,并且后续文件,我们只使用第一个字段作为数组的索引,打印在那里找到的值,以及完整的输入行($0)。

我们还可以通过检查s[$1]是否存在并且是非空的来为未知的标记添加已知标记(而不是空):

$ awk 'FNR==NR {s[$1] = $2; next} {if (s[$1]) print s[$1], $0; else print "unknown", $0;  next}' servers data.txt

使用shell中的服务器名称,可以生成servers文件,如下所示:

site1="server1 server2 ..."
site2="server3 ..."
true > servers        # to clear the file
for x in $site1 ; do echo "$x site1" ; done >> servers
for x in $site2 ; do echo "$x site2" ; done >> servers

答案 1 :(得分:0)

试试这个:

awk -F '[ ="]+' 'NR==FNR {for (i=2; i<=NF; i++) { sites[$i]=$1; }; next }
                 { print sites[$1] " " $0 }' sites data