我有一个包含防火墙日志的文件,如下所示:
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
后跟=
[^:]\+:[^:]\+
一个或多个非冒号字符,后跟:
,后跟一个或多个非冒号字符\|
或者proto=[^ ]\+'
匹配proto=
后跟一个或多个非空格字符
我们可以使用以下命令将换行符粘合在一起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'
您不需要cat
像awk
已经写入标准输出那样。上面的命令打印那些由空格分隔的字段,这就是逗号的作用,然后它将字段分隔符设置为由空格包围的逗号并用于sed
删除:X0
and :X1
。
输出:
src=12.1.1.11:49894 , dst=4.2.2.2:53 , proto=udp/dns