如何打印文件中各行的统计信息

如何打印文件中各行的统计信息

我经常发现自己在过滤日志文件后手动计算百分比以找到其中 X 或 Y 的比例。这可以通过常见的 CLI 工具轻松实现吗?

答案1

通常,我会在日志文件中找出一些我想要区分的特征,然后获取百分比。这可以通过 sed 轻松完成,替换每一行中不需要的内容,然后计算每个出现的次数。例如,要在日志文件中区分 Linux 和 Windows 命中,您可以执行以下操作:

$ cat some.log | sed -r 's/.*(Windows|Linux).*/\1/' | sort | uniq -c | sort -rn
23940 Windows
12390 Linux

这会为您提供您正在寻找的每个特征的绝对计数,但不是百分比,因此它还不是理想的。

看来 awk 不能轻易地循环两次来首先计算总数然后输出百分​​比,但通过一个小技巧,我们可以首先在顶部添加一行来显示所有匹配特征的总和:

$ ... | awk '{s+=$1;lines=lines"\n"$0} END {printf "%d Total",s;print lines}' 
Total 36330
Windows 23940
Linux 12390

最后,既然我们有了总数,我们可以使用以下方法轻松计算和打印百分比:

$ ... | awk '!max{max=$1}{s=$1/max*100;c=$1;$1="";printf "%30s %10d %7.2f%%\n",$0,c,s;}'
Total     36330   100.00%
Windows   23940    65.90%
Linux     12390    34.10%

合并后的一行代码如下:

cat some.log | sed -r 's/.*(Windows|Linux).*/\1/' | sort | uniq -c | sort -rn | awk '{s+=$1;lines=lines"\n"$0} END {printf "%d Total",s;print lines}' | awk '!max{max=$1}{s=$1/max*100;c=$1;$1="";printf "%30s %10d %7.2f%%\n",$0,c,s;}'

some.log您要检查的文件在哪里,并且Windows|Linux是一个要匹配/区分的以竖线分隔的术语列表。

如果您想要删除末尾的“总计”行,因为它变得有点不相关,您可以将它附加| tail -n +2到它。

相关内容