awk 中的匹配字符串

Ara*_*ash 1 bash shell awk

如何搜索文件以查找具有 SRC= 的行,例如此处?我的意思是我如何使用 awk 在这个文件中找到源 IP 地址,例如

Mar 10 03:17:12 ubuntu kernel: [11045.721649] Type=ScanXMASIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.28 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=47 ID=6603 PROTO=TCP SPT=47301 DPT=53 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0 
Mar 10 03:17:12 ubuntu kernel: [11045.721702] Type=ScanXMASIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.30 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=42 ID=6802 PROTO=TCP SPT=47301 DPT=5900 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0 
Mar 10 03:17:32 ubuntu kernel: [11065.703937] Type=ScanACKIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.31 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=40 ID=62992 PROTO=TCP SPT=47301 DPT=1521 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0 
Mar 10 03:17:32 ubuntu kernel: [11065.706729] Type=ScanXMASIN=eth0 OUT= MAC=00:0c:29:a1:51:1c:00:0c:29:23:9d:e4:08:00 SRC=192.168.1.32 DST=192.168.1.27 LEN=40 TOS=0x00 PREC=0x00 TTL=47 ID=15170 PROTO=TCP SPT=47301 DPT=14442 WINDOW=1024 RES=0x00 URG PSH FIN URGP=0
Run Code Online (Sandbox Code Playgroud)

然后我想得到这个输出:

192.168.1.28
192.168.1.30
192.168.1.31
192.168.1.32
Run Code Online (Sandbox Code Playgroud)

有很多行(100,000),我想搜索 SRC= 然后当我找到行时裁剪 SRC= 并找到 IP 地址

使用AWK

谢谢你们!:)

Tob*_*bia 5

不幸的是 awk 没有捕获它的组。您可能想要寻找一种更现代的工具来编写单行程序,例如 Perl。

话虽如此,在您的情况下,最快的方法取决于 SRC= 是否始终位于日志中的同一位置。

如果它总是在同一个地方,并且参数总是包含相同数量的等号,你可以在等号和空格上分开你的行并取第 15 个字段:

awk -F'[= ]' '{print $15}'
Run Code Online (Sandbox Code Playgroud)

否则,为了获得更强大的方法,您可以替换掉导致 SRC= 的部分及其后面的部分:

awk '{sub(/.* SRC=/, ""); sub(/ .*/, ""); print;}'
Run Code Online (Sandbox Code Playgroud)

如果您需要计算出现次数,您可以| sort | uniq -c | sort -rn在管道中添加一个惯用语,但这对于 100,000 行是低效的。您最好在前两个步骤中使用 awk 的内置字典类型:

awk '{sub(/.* SRC=/, ""); sub(/ .*/, ""); ips[$0]++;}
     END {for (ip in ips) printf("%8d  %s\n", ips[ip], ip);}' | sort -nr
Run Code Online (Sandbox Code Playgroud)

两者的输出应如下所示:

7513  192.168.1.28
 330  192.168.1.30
 103  192.168.1.31
  19  192.168.1.32
Run Code Online (Sandbox Code Playgroud)