2017-06-13 109 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