2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:58:23 8.8.8.8 8.8.4.4
2018-05-24 23:59:40 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
因为我有上述格式的日志文件。现在我需要对其进行解析,输出应如下所示(如果重复行数据,则通过比较第 3 列和第 4 列仅显示第一行和最后一行。
2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
Perl 的救援:
-n
逐行读取输入并运行每一行的代码。-a
将空格上的每个输入行拆分为 @F 数组。与
awk
:关联的
first
数组使用 column#3 和 column#4 的键组合保留第一个出现的行,但该last
数组每次都使用相同的键保存最新的行。读取所有行后,
first
数组中的值是最开始出现的行(具有不同的列#3、#4),其中的值last
是最后出现的行。然后在
END
打印时保存在first
数组和下一个中的值last
。当这(last[x] != first[x]? ORS last[x]:"")
是唯一没有重复 column3&4 组合的唯一行时,这用于防止重复该行。在这种情况下,您也可以只使用仅比较列 3,4 的唯一行,然后附加最后一行。但是,如果所有其他行的第 3 列和第 4 列不同,这可能会导致最后一行重复。
然后只需将另一个管道添加到 uniq 以在需要时删除。
{uniq <your_file> -f2; tail -n1 <your_file>; } | cat | uniq
-f 此处跳过前 2 个空格分隔的字段。
§ 这个怎么运作。
第一个变体
第二种变体
测试
输入(测试复杂)
输出(两种变体)
§ 这个怎么运作。
¶ 阐述了另一种使用 sed 编辑器的方法。