我经常发现自己在过滤日志文件后手动计算百分比以找到其中 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
到它。