1つのマルチキャストグループインスタンスに関連する3行から5行の情報を含むファイルがあり、このファイルには複数のマルチキャストグループインスタンスが含まれています。
Group: 239.103.0.64
Source: 10.12.49.30/32
Upstream interface: ge-0/0/7.0
Group: 239.103.0.66
Source: 10.12.49.38/32
Upstream interface: ge-0/0/9.0
Group: 239.103.0.71
Source: 10.12.49.2/32
Upstream interface: ge-0/0/0.0
Downstream interface list:
xe-5/0/0.0
Group: 239.103.0.72
Source: 10.12.49.6/32
Upstream interface: ge-0/0/1.0
Downstream interface list:
xe-5/0/0.0
xe-5/0/1.0
各インスタンスに対して、マルチキャストIPアドレス、送信元IPアドレス、アップストリームインターフェイス、およびダウンストリームインターフェイスのリストを含む1行の出力を作成しようとしています。ここで、フィールドは次のように区切ります。:上記の出力は次のようになります。
239.103.0.64:10.12.49.30/32:ge-0/0/7.0:
239.103.0.66:10.12.49.38/32:ge-0/0/9.0:
239.103.0.71:10.12.49.2/32:ge-0/0/0.0:xe-5/0/0.0
239.103.0.72:10.12.49.6/32:ge-0/0/1.0:xe-5/0/0.0 xe-5/0/1.0
答え1
awk '
/Group:/ {g=$2; next}
/Source:/ {s=$2; next}
/Upstream interface:/ {u=$3; next}
/Downstream interface list:/ {dflag=1; next}
/^$/ {print g ":" s ":" u ":" d; g = s = u = d = ""; dflag = 0; }
{ if (dflag) { if (d == "") d = $1; else d = d " " $1} }
END {print g ":" s ":" u ":" d; g = s = u = d = ""; dflag = 0; }
'
- プログラムの最初の3行は
awk
非常に簡単です。そのラベルが表示されたら、マルチキャストIPアドレス、送信元IPアドレス、およびアップストリームインターフェイスの値をキャプチャします。 - 4行目は、「ダウンストリームインターフェイスリスト」ラベルを確認した後、後続の(空白ではない)行にダウンストリームインターフェイスが含まれていることがわかるようにフラグを設定します。
- 次の6行目を見る方が合理的です。 「ダウンストリームインターフェースのリスト」ラベルが表示されている場合は、リストされた値を収集してスペースで区切ります。
- 5行と7行はほぼ同じです。空の行またはファイルの終わりに達すると、これまでに収集されたデータを印刷します。
答え2
きれいではありませんが、作業が完了したと思います。
awk -F":" 'BEGIN {RS=""};{$1="";$3=$5=$7=":";gsub(/(\ *)?:(\ *)?/,":");print $0}' test.txt |tr -s " "
答え3
後ろに空白があっても大丈夫なら、次のように言えます。
awk -v RS='' -v OFS=':' -F'[:\n] *' '{ print $2, $4, $6, $9 " " $10 }'