shell - 为 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
- 所以 dst 和 src IP 的位置是否改变都没有关系。@埃德莫顿
解决方案
假设前 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
请注意,缺少字段的记录也会被分组。您可能希望单独打印所有这些。
推荐阅读
- javascript - 如何使用“xml2js”库在 xml 1.0 中转义“SOH”字符?
- python - 返回另一个数组中数字的提取索引
- python - 如何替换列表中的特定值?
- javascript - Formik 在有效字段更改后调度 Redux 操作
- deep-learning - 我可以在进行深度学习时使用来自不同来源的数据集吗
- php - 未捕获的 PHP 异常 Symfony\Component\HttpKernel\Exception\NotFoundHttpException:“没有为“GET /”找到路由
- c++ - 带有 std::tuple_cat 的模板实例化 decltype 和 declval
- javascript - 使用来自 JSON 对象的数据填充具有多条线的 Chart.Js 折线图
- javascript - 使用 Typescript 在 Webpack 编译期间动态导入模块
- r - 计算 R 中具有特定名称模式的列的行均值