假设我有一个包含抛出异常的日志文件:
ExceptionA
loggedFunctionCall
ExceptionB
ExceptionA
loggedFunctionCall
ExceptionD
ExceptionB
loggedFunctionCall
ExceptionB
我想计算每个不同异常的出现次数,目前我的解决方案是:
cat file.txt | grep Exception | sort | uniq -c | sort -n
结果:
1 ExceptionD
2 ExceptionA
3 ExceptionB
不过我想在右侧显示计数并去掉这些缩进,所以最终的效果应该如下所示:
ExceptionD 1
ExceptionA 2
ExceptionB 3
我正在寻找一个简单的解决方案 - 最好不编写任何额外的 bash 脚本,只需使用纯终端命令。
答案1
您可以使用一个简单的 awk 命令来完成整个任务:
awk '/Exception/{a[$0]++} END {for (x in a) print x,a[x]}' file | sort -nk2
输出
ExceptionD 1
ExceptionA 2
ExceptionB 3
关联数组的顺序awk
是未定义的,因此通常您需要通过管道传递到sort
,k2
意味着按第二个字段排序。
另一种排序方法是使用 GNUawk
预定排序并按数值升序排序:
awk '/Exception/{a[$0]++} END {
PROCINFO["sorted_in"] = "@val_num_asc"
for (x in a) print x,a[x]
}' file
另外,如果您想保留现有命令,并且只是反转两个字段的位置,您可以修改为:
grep 'Exception' file | sort | uniq -c | awk '{print $2,$1}' | sort -nk2
答案2
和perl
perl -lne '$h{$_}++ if /Exception/;
END{print "$_ $h{$_}" for sort {$h{$a} <=> $h{$b}} keys %h}'
sort {$h{$a} <=> $h{$b}} keys %h
将根据哈希值进行排序。看https://perldoc.perl.org/functions/keys了解详情。