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

NRawkから見たレコード(行)の数でありますこれまでのところ、FNRこれまでに見たこのファイル内のレコード数。それらをFNR==NRと比較することは、最初のファイルを残りのファイルから分離するための共通のイディオムです。したがって、最初のファイルの各行について、最初のフィールド($1)をキーにして2番目のフィールド($2)を値として、next行にジャンプして、見つかった値を配列sに設定します。 (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 

サーバー名を使用すると、シェルの中に持っていたとして、あなたが作り出すことができますこのようなもので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を使ったことがありません...あなたは何をやっているのか説明できますか? "datafile"と "serveitepairing"ファイルをどのように指定するのですか?私は理解する必要があります... – cwheeler33

+0

hmmm ...ペアファイルを作成するために、私は単純に何かをやってみることができます(後で構文をチェックしてください)... 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 
関連する問題