kom*_*awi 5 grep awk text-processing sort uniq
假设我有一个包含抛出异常的日志文件:
ExceptionA
loggedFunctionCall
ExceptionB
ExceptionA
loggedFunctionCall
ExceptionD
ExceptionB
loggedFunctionCall
ExceptionB
Run Code Online (Sandbox Code Playgroud)
我想计算每个不同异常的出现次数,目前我的解决方案是:
cat file.txt | grep Exception | sort | uniq -c | sort -n
结果:
1 ExceptionD
2 ExceptionA
3 ExceptionB
Run Code Online (Sandbox Code Playgroud)
但是我想在右侧显示计数并摆脱这些缩进,因此最终效果应如下所示:
ExceptionD 1
ExceptionA 2
ExceptionB 3
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个简单的解决方案 - 最好不编写任何额外的 bash 脚本,只需使用纯终端命令即可。
您可以对整个任务使用一个简单的 awk 命令:
awk '/Exception/{a[$0]++} END {for (x in a) print x,a[x]}' file | sort -nk2
Run Code Online (Sandbox Code Playgroud)
输出
ExceptionD 1
ExceptionA 2
ExceptionB 3
Run Code Online (Sandbox Code Playgroud)
awk
关联数组的顺序未定义,因此通常您需要通过管道连接到sort
,k2
意味着按第二个字段排序。
另一种排序方法是使用 GNUawk
预定义排序并按数值升序排序:
awk '/Exception/{a[$0]++} END {
PROCINFO["sorted_in"] = "@val_num_asc"
for (x in a) print x,a[x]
}' file
Run Code Online (Sandbox Code Playgroud)
此外,如果您想保留现有命令,并且只是反转两个字段的位置,您可以修改为:
grep 'Exception' file | sort | uniq -c | awk '{print $2,$1}' | sort -nk2
Run Code Online (Sandbox Code Playgroud)