我有这个 iptable 日志:

Feb 25 10:32:48 XXX: [414645.555838] FW: DEN TCP IN=eth0 OUT= MAC=XYZ SRC=1.1.1.1 DST=2.2.2.2 LEN=40 TOS=0x00 PREC=0x00 TTL=57 ID=0 DF PROTO=TCP SPT=80 DPT=51814 WINDOW=0 RES=0x00 RST URGP=0

我想 grep 1.1.1.1 和 80(SRC 和 SPT 字段)。
我这样做:
grep -oP 'SRC=([^ ]+).+SPT=([0-9]+)' /var/log/iptables.log

但它返回:
SRC=1.1.1.1 DST=2.2.2.2 LEN=40 TOS=0x00 PREC=0x00 TTL=57 ID=0 DF PROTO=TCP SPT=80

如何仅获得 $1 和 $2(引用匹配值)?

最佳答案

sed 方法:

sed -rn 's/.*SRC=([^ ]+).*SPT=([0-9]+).*/\1 \2/p' /var/log/iptables.log

您可以将其通过管道传输到脚本中的 while read src spt 或类似内容。现在这当然不是很有效,因为模式中的三颗星,所以如果性能有问题,你可以考虑使用 cut 之类的东西来提取某些字段:
cut -d' ' -f12,21 /var/log/iptables.log

不确定日志格式是否足够一致以使其正常工作。

10-05 20:17