对不可靠的SRC + DST IP排序日志文件

时间:2019-02-05 14:13:38

标签: shell sorting awk

我想对日志文件(〜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
  • 因此dst和src IP的位置是否改变都无关紧要。 @Ed Morton

1 个答案:

答案 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

请注意,缺少字段的记录也会被分组。您可能需要单独打印所有这些内容。