'egrep -o“成功|错误|失败”的替代方法<文件名> | 排序| uniq -c'


8

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

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

我想知道是否有人知道用较短的命令执行此操作的方法?

在您问我为什么要使用其他命令来执行此操作之前...没有特殊原因,我只是很好奇:)

Answers:


4

这是awk这样做的方法

awk 'BEGIN{RS=" "}/success/{s++}/fail/{f++}/error/{e++}END{print "Success:"s" Failed:"f" Error:"e}' abc

但是所有这些衬里都会比我们的旧货更长 grep


4

不,我认为您很出色。当然,您可以使用一个perl脚本来做到这一点,

perl -nle  's/.*(error|fail|success).*/$1/ && $a{$_}++ ; END {  print "$_ $a{$_}" for keys %a } ' test.txt

...但是它更复杂且不直观。


我在问题中添加了示例输入...希望现在可以更清楚地知道该命令的功能...不便之处
敬请原谅

1
好的,我相应地修改了perl oneliner。我仍然认为,使用egrep的解决方案更好,更直观。
1

2

没那么短,但是由于您实际上不需要正则表达式,所以有了fgrepgrep -F)。

fgrep 'success
error
fail' "$filename" | sort | uniq -c

在bash中编写相同内容的另一种方法:

fgrep $'success\nerror\nfail' "$filename" | sort | uniq -c

1

您可以编写一个简单的bash脚本,然后调用该脚本,例如:

#!/bin/bash
egrep -o "success|error|fail" "$1" | sort | uniq -c

并将其另存为(例如)myscript.sh。然后做一个chmod +x myscript.sh,你可以这样称呼它myscript.sh <filename>


但是在这种情况下,命令是相同的...您刚刚创建了一个调用该命令的脚本...
Wolfy 2012年

我以为您只是想加快日志记录速度。很好奇,如果您已经提供的命令对您有帮助,为什么还要一个替代命令?
jeremija 2012年

就像我说的那样:我很好奇别人是怎么做的……很多次我意识到人们知道一些花哨/好做事的方式,而且我喜欢现在学习做事的方式……
Wolfy

2
在那种情况下,您就是那个人:-)您的命令行很好,简洁,清晰,并利用了Unix命令行的功能。还有什么希望?
1

0

您的命令虽然简短有趣,但却是一种计算术语出现次数的circuit回方式。我可能会采取直截了当的直接方法,并在shell循环中使用grep的-c标志(确实做到了这一点):

for i in success test fail; do echo `grep -c $i <filename>` $i; done

对于大型日志文件,它不那么短,也不那么令人兴奋,可能更快(否sort)。我会说这是洗。


-1

这可能是一个虚拟的答案,但在这种情况下,我认为这sort是毫无用处的。也许您可以忽略它。不过,在这里,我们对三种不同的动作使用了三种不同的命令。

如果其中一些可以通过的某些选项来实现,则可以将其缩写grep,但是我看不到... :)


2
不,不是这样,否则uniq将仅计算连续的搜索词实例。例如,如果您有成功,成功,失败,成功,那么uniq的输出将为2 success 1 fail 1 success
一月

没关系...
对不起
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.