2017-06-13 87 views
0

我遇到了一些麻烦,找出如何追加在每行的开头,如果行的开头匹配变量中的servername。虽然很好,但不是必需的是,如果没有网站匹配,在行的开头指示“未知网站”。bash sed如何追加到行首,匹配变量在行首

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

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

你从哪里获得每个站点的机器名称? – 123

+0

机器名称是手动创建的列表。 “已知”是准确的。 – cwheeler33

+0

他们可以放在一个文件? – 123

回答

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进行比较是将第一个文件与其他文件分开的常用成语。因此,对于第一个文件的每一行,我们将找到的值设置为第一个字段($1)作为键的数组s,然后跳转到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 
+0

创建服务器<>站点文件将是非常劳动密集的一个几百台服务器...... – cwheeler33

+0

我从来没有用过awk ......你能解释一下你在做什么吗?以及如何指定“数据文件”和“服务配对”文件?我需要明白... – cwheeler33

+0

嗯...并创建配对文件,我可以简单地做一些事情(稍后请仔细检查语法)... $在site1中的servername做; echo -e“$ servername SiteName \ n”>> serversitepairfile – cwheeler33

0

试试这个:

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