如果行的开头与变量中的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...
答案 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...
...
NR
是awk
到目前为止看到的记录(行数),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