如何清理日志文件以仅显示连续重复的行一次,并用一个数字表示该行重复了多少次?

1 logs awk uniq

当前日志:

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,希望有人可以将我链接到解决方案,或者将其视为一个有趣的练习。干杯。

Whi*_*Owl 6

不需要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)