私のiptablesログファイル(Ubuntu 16-04)で、LANルーターとLAN上の他のホストのIGMPに関するすべてのメッセージには「PROTO = 2」があります。これを変更して「PROTO = IGMP」を取得する方法はありますか?
答え1
sed -e "$(awk '/^[[:space:]]*(#|$)/ { next } ;
{ print "s/ PROTO="$2" / PROTO="$3" /;" }' \
/etc/protocols)" /path/to/iptables.log
これは、ファイルのフィールド2と3に基づいてスクリプトを設定するために使用されますawk
。次に、からスクリプトを実行します。これは変換されますsed
/etc/protocols
sed
/path/to/iptables.log
みんなログファイルのプロトコル番号をその名前で再指定します。
必要に応じて、スクリプトの出力をawk
ファイルに保存できます(たとえば、スクリプトを呼び出してverbose-proto.sed
実行またはsed -f
編集して、#!/bin/sed -f
最初の行に追加してchmod
実行可能にすることもできます)。
$ awk '/^[[:space:]]*(#|$)/ { next } ;
{ print "s/ PROTO="$2" / PROTO="$3" /;" }' \
/etc/protocols > ./verbose-proto.sed
$ printf "%s\n" 1 i '#!/bin/sed -f' . w | ed -s verbose-proto.sed
$ chmod +x ./verbose-proto.sed
$ ./verbose-proto.sed /path/to/iptables.log
2
1つのプロトコル番号に変更したい場合ははるかにIGMP
簡単です。
sed -e 's/ PROTO=2 / PROTO=IGMP /' /path/to/iptables.log
(awk
スクリプトは正規表現検索と代替規則を使用して、以下のように約50行を生成します。すべての既知のプロトコルに対して1つずつ/etc/protocols
)