我想对日志文件(〜5 GB)进行排序,以查找唯一的连接事件。 唯一的(SRC_IP + DST_IP)-具有时间戳和其他信息。
示例:
1 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.2" dstip="10.10.10.2"...
2 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.1" dstip="10.10.10.2"...
3 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.2" dstip="10.10.10.1"...
4 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.2" dstip="10.10.10.2"...
5 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.2" dstip="10.10.10.2"...
输出事件应为:
1 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.2" dstip="10.10.10.2"...
2 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.1" dstip="10.10.10.2"...
3 Feb 5 14:59:00 initf="eth0" outift="eth1" srcip="192.168.0.2" dstip="10.10.10.1"...
因为src + dst IP的组合是唯一的。我用-uk column 进行了排序,但是它没有按预期工作。另外,src + dst IP的列不一致。有时会切换,因为取决于出接口,是否提交了dstmac。
也许AWK脚本可以解决问题?
编辑
由于Karakfa提出了很好的建议,所以用awk解决了这个问题-我目前正在尝试将[$ 7,$ 8]更改为正则表达式
awk '!a[regexpression for src ip, regexpression for dst ip]++' file
答案 0 :(得分:1)
假定前8个字段值中没有空格,这将使您首次看到该键组合。
$ awk '!a[$7,$8]++' file
这不需要排序的输入(并且不会更改订单本身),您可以通过管道将其与所需的订单进行排序。 如果字段顺序不固定,则可以执行以下操作:
$ awk '{for(i=1;i<=NF;i++) if($i~/^srcip=/) s=$i; else if($i~/^dstip=/) d=$i}
!a[s,d]++;
{s=d=""}' file
请注意,缺少字段的记录也会被分组。您可能需要单独打印所有这些内容。