1

我需要创建一个 bash 文件来搜索日志文件中包含的所有行

Aug  9 16:11:46 igs kernel: [ATTS] Caution: IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=1.1.1.1 DST=192.168.0.100 LEN=33 TOS=0x00 PREC=0x00 TTL=121 ID=9690 DF PROTO=TCP SPT=601 DPT=12500 LEN=13
Aug  9 16:11:46 igs kernel: [ATTS] Caution: IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=2.2.2.2 DST=192.168.0.100 LEN=33 TOS=0x00 PREC=0x00 TTL=121 ID=9689 DF PROTO=TCP SPT=602 DPT=12502 LEN=13
Aug  9 16:11:46 igs kernel: [ATTS] Caution: IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=3.3.3.3 DST=192.168.0.100 LEN=33 TOS=0x00 PREC=0x00 TTL=121 ID=9691 DF PROTO=TCP SPT=600 DPT=12503 LEN=13
Aug  9 16:11:46 igs kernel: [ATTS] Caution: IN=eth0 OUT= MAC=xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx SRC=1.1.1.1 DST=192.168.0.100 LEN=33 TOS=0x00 PREC=0x00 TTL=121 ID=9691 DF PROTO=TCP SPT=600 DPT=12503 LEN=13

然后提取“SRC=”中的IP并将IP保存到名称为“ip.list”的外部文件中,但不要重复相同的IP

ip.list 的示例输出

1.1.1.1
2.2.2.2
3.3.3.3
4

3 回答 3

4

您可以为此使用awk和:sort

awk '/Caution: IN=/ {print substr($11,5)}' infile | sort -u

只需将搜索字符串调整为您想要的(我使用过"Caution: IN=")。

它的awk作用是,对于与搜索字符串匹配的每个石灰,它会打印出从第五个字符(IP 地址的第一个数字)开始的第十一个参数 ( "SRC=aaa.bbb.ccc.ddd")。

然后传递其输出,sort -u首先排序然后删除重复的行。

输出是您所期望的:

pax> awk '/Caution: IN=/ {print substr($11,5)}' infile | sort -u
1.1.1.1
2.2.2.2
3.3.3.3
于 2012-08-10T08:01:34.437 回答
1

sed也可以这样做:

 sed 's/.*SRC=\([0-9.]\+\).*/\1/' infile | sort -u
于 2012-08-10T08:12:18.680 回答
0

或使用grepand coreutils

grep Caution: logfile | cut -d= -f5 | cut -d' ' -f1 | sort -u
于 2012-08-10T09:10:35.247 回答