我有时需要检查一些日志,我使用以下命令执行此操作:
egrep -o "success|error|fail" <filename> | sort | uniq -c
示例输入:
test error on line 10
test connect success
test insert success
test started at 00:00
test delete fail
示例输出:
1 error
1 fail
2 success
我想知道是否有人知道如何用更短的命令来做到这一点?
在您问我为什么要用不同的命令执行此操作之前...没有什么特殊原因,我只是好奇:)
答案1
以下是具体awk
做法
awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc
但所有这些单句台词都会比我们以前的好grep
答案2
不,我认为你已经很厉害了。当然,你可以用一个 perl 脚本来完成,
perl -nle 's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END { print "$_ $a{$_}" for keys %a } ' test.txt
...但它更加复杂且不太直观。
答案3
不是很短,但是由于您实际上不需要正则表达式,所以有fgrep
(grep -F
)。
fgrep 'success
error
fail' "$filename" | sort | uniq -c
在 bash 中写同样内容的另一种方法:
fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c
答案4
您的命令虽然简短而友好,但却是一种计算术语出现次数的相当迂回的方法。我可能会采取直截了当的直接方法,并在 shell 循环中使用 grep 的 -c 标志(它的作用正是如此):
for i in success test fail; do echo `grep -c $i <filename>` $i; done
不那么短,不那么令人兴奋,对于大型日志文件来说可能更快(不sort
)。我会说这是一场平局。