次のファイアウォールログを含むファイルがあります。
Feb 3 0:18:51 17.1.1.1 id=firewall sn=qasasdasd "time=""2018-02-03" 22:47:55 "UTC""" fw=111.111.111.111 pri=6 c=2644 m=88 "msg=""Connection" "Opened""" app=2 n=2437 src=12.1.1.11:49894:X0 dst=4.2.2.2:53:X1 dstMac=42:16:1b:af:8e:e1 proto=udp/dns sent=83 "rule=""5" "(LAN->WAN)"""
次の出力を取得する必要があります。
src=ipaddress:port , dst=ipaddress:port , proto=udp/dns
具体的には、上記入力の場合、
src=12.1.1.11:49894,dst=4.2.2.2:53,proto=udp/dns
頑張った
cat logfile.txt | awk '{ print $18" "$19" "$21 }'
しかし、結果は私が期待したものとは異なるようです。
答え1
使用grep
:
$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt
src=12.1.1.11:49894
dst=4.2.2.2:53
proto=udp/dns
説明する:
'\(src\|dst\)=
一致src
またはdst
フォロー=
[^:]\+:[^:]\+
コロン以外の文字 1 つ以上、その後に:
コロン以外の文字 1 つ以上\|
またはproto=[^ ]\+'
一致proto=
の後に空白以外の文字が 1 つ以上続きます。
以下を使用して改行文字を貼り付けることができますpaste
。
$ grep -o '\(src\|dst\)=[^:]\+:[^:]\+\|proto=[^ ]\+' logfile.txt | paste -s -d,
src=12.1.1.11:49894,dst=4.2.2.2:53,proto=udp/dns
答え2
持っているものに応じて:
awk '{print $18,$19,$21}' OFS=" , " logfile.txt | sed 's|:X[0-1]||g'
そのようにstdoutに書き込む必要はありませんcat
。awk
上記のコマンドは、スペースで区切られたフィールド(カンマの目的)を印刷してから、フィールド区切り文字をスペースで囲まれたカンマに設定し、削除するために使用されますsed
。:X0
:X1
出力:
src=12.1.1.11:49894 , dst=4.2.2.2:53 , proto=udp/dns