2016-04-13 12 views
0

私はbashスクリプトには新しく、私はスクリプトを開発する際の思考プロセスを説明する答えを探しています。bashスクリプトを使ってリストを作成する

私は設定ファイルにホストのリストを持っていますが、それをYAMLに変換する必要があります。私は設定から​​ホスト名とIPを削除して、新しい設定を生成する必要があります。

最初の情報セットを特定して削除し、それを新しいセットに挿入するにはどうすればよいですか。

<Host "HOSTNAME"> 
    Address "10.10.10.10" 
    Version 2 
    Community "STRINGHERE" 
    Collect "linux_cpu_wait_raw" "linux_cpu_nice_raw" "linux_cpu_kernel_raw" "linux_mem_total" "linux_mem_avail" "linux_load" 
</Host> 

は私が達成しようとしている何のような何かをする例を見つけるのに苦労しています。この

'HOSTNAME': 
    Address: '10.10.10.10' 
    Version: 2 
    Community: 'STRINGHERE' 
    Collect: ['linux_cpu_wait_raw', 'linux_cpu_nice_raw', 'linux_cpu_kernel_raw', 'linux_mem_total', 'linux_mem_avail', 'linux_load'] 

のようになります。

ありがとう、

いずれの方向にも感謝します。

+1

sedまたはawkを使用してください。あなたは何を試しましたか、なぜあなたのために働いていませんか? –

+1

CodeGnomeは、ここで助けを求める前に、あなた自身の問題を解決しようとすることが一般的に予想されることを示しています。あなたの入力が通常であることが保証されている場合に動作する 'awk'に加えて、' jq'や 'xmlstarlet'(xmlを消費できる他の言語と同様に)を調べるべきでしょう強く –

答えて

0

awkレスキュー!

あなたが特殊なツールを持っていない場合は、この

$ awk -v q="'" '{gsub(/"/,q)} 
    NF==2&&/Host/{sub(">",":"); print $2; next} 
      NF>2{printf "\t%s: [" , $1; 
       for(i=2;i<NF;i++) printf "%s, ", $i; 
       printf "%s]\n", $NF} 
      NF==2{printf "\t%s: %s\n", $1, $2}' xml 

'HOSTNAME': 
     Address: '10.10.10.10' 
     Version: 2 
     Community: 'STRINGHERE' 
     Collect: ['linux_cpu_wait_raw', 'linux_cpu_nice_raw', 'linux_cpu_kernel_raw', 'linux_mem_total', 'linux_mem_avail', 'linux_load'] 

のようなスクリプトをハックすることができますが、これは構造の知識を持たないし、あなたの入力フォーマットが変更された場合失敗することがあり...

awkスクリプトがであるので、説明

-v q="'"は、単一引用符のための変数を設定しました一重引用符、エスケープとあまりにも多くの視覚的なノイズが必要です。それは の使い方です。

{gsub(/"/,q)} 2つの フィールド(デフォルトのフィールドセパレータは空白である)とマッチングパターン ホストとラインの単一引用符

NF==2&&/Host/{sub(">",":"); print $2; next}持つすべての二重引用符は:>記号を交換し、第2のフィールドを印刷する移動交換二つ以上の フィールドは角括弧形

のフィールドを印刷ラインのため 次のライン

NF>2{printf "\t%s: [" ...唯一の2つのフィールドを持つ他のラインのための

は、 name: valueフォームここ

+0

これはうまくいきました。それを分解したり、どこに私がそれを読んで読んだりすることができますか? – nutriux

0

で印刷sedと別の実装です。

#removed closed tag 
\#</.*#d 
#removed open tag 
s/<[a-zA-Z]\+ // 
#append colon to open tag line 
s/>/:/ 
#append colon to other lines 
s/^\(.*[a-zA-Z]\+\)\(\s.*\)$/\1:\2/ 
#quote with brackets 
s/\("[^"]\+"\($\|\s\)\)\{2,\}/\[&\]/ 
#replace double quote with single quote 
s/"/'/g 
#add comma seperated 
s/'\s/', /g 

保存SED file.sed、上記のような構文、および

$ sed -f file.sed file.txt 

として、または単一行のコマンドファイルのフォーマットが変更された場合

$ sed -e '\#</.*#d' -e 's/<[a-zA-Z]\+ //' -e 's/>/:/' -e 's/^\(.*[a-zA-Z]\+\)\(\s.*\)$/\1:\2/' -e 's/\("[^"]\+"\($\|\s\)\)\{2,\}/\[&\]/' -e "s/\"/'/g" -e "s/'\\s/', /g" file.txt 

で、それが動作しない場合があります実行します。出力例は

$ sed -f file.sed file.txt 
'HOSTNAME': 
    Address: '10.10.10.10' 
    Version: 2 
    Community: 'STRINGHERE' 
    Collect: ['linux_cpu_wait_raw', 'linux_cpu_nice_raw', 'linux_cpu_kernel_raw', 'linux_mem_total', 'linux_mem_avail', 'linux_load'] 
関連する問題