首页 > 解决方案 > 为 unqiue SRC + DST IP 排序日志文件

问题描述

我想对我的日志文件 (~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 的组合是独一无二的。我用 sort -uk尝试了这个,但它没有按预期工作。src + dst IP的列也不一致。它有时会切换,因为取决于输出接口,dstmac 是否提交。

也许 AWK 脚本可以解决问题?

编辑

由于 Karakfa 提出了一个很好的建议,因此使用 awk 解决了这个问题 - 我目前正在尝试将 [$7,$8] 更改为正则表达式

awk '!a[regexpression for src ip, regexpression for dst ip]++' file

标签: shellsortingawk

解决方案


假设前 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

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


推荐阅读