'egrep -o "success|error|fail" 的替代方案|排序 | uniq-c'

'egrep -o "success|error|fail" 的替代方案|排序 | uniq-c'

我有时需要检查一些日志,我使用以下命令执行此操作:

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

不是很短,但是由于您实际上不需要正则表达式,所以有fgrepgrep -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)。我会说这是一场平局。

相关内容