2011-09-22 37 views
1

我正在尝试编写一个bash脚本来计算特定模式在文件列表上的匹配次数。计算多个文件中特定正则表达式的出现次数

我已经搜索了解决方案,但我只找到单个文件的解决方案。

我知道我可以使用egrep -o PATTERN file,但是我如何概括文件列表并在最后输出总和?

编辑:添加脚本我想写:

#! /bin/bash 

egrep -o -c "\s*assert.*;" $1 | awk -F: '{sum+=$2} END{print sum}' 

在命令行中运行egrep的直接工作正常,但一个bash脚本中没有。我是否需要特别保护RegEx?

+0

恐怕这个要求是非常特殊的,你必须明确地做到这一点。 – TMS

回答

4

你可以使用grep -c来统计每个文件中的比赛,然后在结尾使用awk总结计数,如:

grep -c PATTERN * | awk -F: '{sum+=$2} END{print sum}' 
+0

我从来没有使用awk,似乎是一个漂亮的小东西。我想把它放在一个bash脚本上,但它不起作用,它总是返回'0'。看看上面的脚本。 –

+0

@TiagoVeloso:'grep -c PATTERN *'是什么打印出来的?它应该是'file:count',每个输入文件一行。 – NPE

+0

它正在如此工作,只有当我将该命令放在脚本文件上时才会出现问题。 –

3
grep -o <pattern> file1 [file2 .. | *] | 
    uniq -c 

如果你只想要总:

grep -o <pattern> file1 [file2 .. | *] | wc -l 

编辑:这种排序似乎没有必要。

+1

+1。水衣橱实用岩石:) – 2011-09-22 15:07:16

1

接受的答案有一个问题,grep将计为1,即使PATTERN可能会在一行上出现多次。此外,一个命令可以完成这项工作

awk 'BEGIN{RS="\0777";FS="PATTERN"} { print NF-1 } ' file 
相关问题