一个perl脚本,列出所有异常及其出现次数

时间:2013-12-18 21:04:41

标签: regex perl bash awk

(我正在为此problem寻找Perl的解决方案,因为awk中的解决方案由于某些原因并不总能正常运行。

以下是目标的摘要:我有一个文件output.txt,它包含Unexpected exception :,后面跟着不同的例外...例如,它看起来像

...
Unexpected exception : exception1
...
Unexpected exception : exception2
...

现在我想编写一个shell脚本summary,它总结了output.txt,特别列出了引发的异常及其出现次数。它应该像:

exception1 : 9
exception2 : 15
...

例外的顺序并不重要(好吧,如果它按事件的数量排序,那就更好了)......

awk解决方案是:

awk -F ' : ' '$1=="Unexpected exception"{a[$2]++} END{for (i in a) print "  ", i,a[i]}' $1

但我不知道为什么有时会起作用,有时则不然。这就是为什么我在寻找Perl的解决方案。有人建议

perl -lne '$a{$1}++ if (/^(Unexpected exception) : (.*?)\s*$/); END { for $i (keys %a) { print " ", $i, $a{$i} } }' $1

(请参阅here),但会返回Unexpected exception177,其中177是例外的总数。那不是我想要的。

有人可以在Perl中提出一个好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

您的perl反向引用不正确:

perl -lne '$a{$1}++ if (/^(Unexpected exception) : (.*?)\s*$/)
                          ^^^^^^^^^^^^^^^^^^^^^-$1 ^^^^^-$2

你想要

 $a{$2}++

代替。或者将第一个()转换为非捕获组:(?:Un....)