当前日志:
18:56:54 Info: Starting
18:56:55 Error: timed out
18:56:56 Error: timed out
18:56:57 Error: timed out
18:56:58 Info: reconnected
18:56:59 Error: timed out
Run Code Online (Sandbox Code Playgroud)
期望的输出:
18:56:54 Info: Starting
18:56:55 Error: timed out (3)
18:56:57 Info: reconnected
18:56:58 Error: timed out
Run Code Online (Sandbox Code Playgroud)
我有可能有数千个重复行的日志文件,我想使用 bash/linux 命令复制 chrome 日志的行为。
我发现了这一点,这很接近: 删除部分重复的连续行但保留第一个和最后一个
它给出了这个神奇的 awk 命令:
awk '{n=$2$3$4$5$6$7}l1!=n{if(p)print l0; print; p=0}l1==n{p=1}{l0=$0; l1=n}END{print}' file
Run Code Online (Sandbox Code Playgroud)
(至关重要的是,排除 n=$1 允许时间戳不同,这是必需的。为压缩行显示的确切时间戳并不重要。)
但是我也需要添加一个计数器,所以我清楚地知道什么被淘汰了,在可读性和准确性之间做出了不错的妥协(唯一丢失的信息是重复消息的确切时间,有第一个或最后一个时间戳就足够了。 )
谢谢,我不擅长 awk,刚刚了解了 uniq,希望有人可以将我链接到解决方案,或者将其视为一个有趣的练习。干杯。
不需要awk
,直接使用uniq
,
uniq -c -f 1 file
Run Code Online (Sandbox Code Playgroud)
该-c
选项提供在输入中连续找到一行的次数的计数,您可以跳过第一个空格或制表符分隔字段中的时间戳-f 1
。
给出问题中的数据的示例:
$ uniq -c -f 1 file
1 18:56:54 Info: Starting
3 18:56:55 Error: timed out
1 18:56:58 Info: reconnected
1 18:56:59 Error: timed out
Run Code Online (Sandbox Code Playgroud)