我想在目录(和任何子目录)中搜索其内容与特定正则表达式匹配的文件,并且对于每个匹配的文件,我想列出正则表达式在该文件中匹配的次数。
例如,如果文件是
line1
line2
line3
linea
lineb
正则表达式是line\d
,那么我想查看数字为 3 的文件,因为第一、第二和第三行与正则表达式匹配。
我该如何去做这样的事情呢?
答案1
要递归地查找与模式匹配的文件find PATH -name PATTERN
- 请参阅man find
。要通过搜索内容find
您要合并的grep
文件的数量find … -exec grep PATTERN +
。最后,GNUgrep
有一个--count
/-c
标志来计算匹配的数量。
$ cd "$(mktemp --directory)"
$ printf '%s\n' foo bar foo > first
$ printf '%s\n' bar foo bar > second
$ printf '%s\n' bar > third
$ find . -name '*r*' -exec grep --count foo {} +
./third:0
./first:2
答案2
如果您满足于仅限于egrep
样式正则表达式,并且计数仅计算与正则表达式匹配的行数(而不是正则表达式匹配的总次数),那么类似这样的方法适用于你:
$ find /directory/name -type f -print | xargs egrep -c "line[0-9]" /dev/null
(/dev/null
最后是一种黑客行为,以防xargs
破坏输出,使得它运行的find
最后一个egrep
命令仅使用一个文件名调用 - 在这种情况下,它将打印计数,但不会打印该计数的文件名适用)。
如果您想危险地生活并尝试使用 Perl 风格的正则表达式,您可以使用grep -P
代替egrep
,但这可能有效也可能无效,具体取决于您运行它的系统。
答案3
您可以使用 的递归版本grep
。如果你只想要文件名,你可以这样做:
grep -rl regex *
您可以通过发送上述输出wc -l
来获取匹配文件的数量。
如果您只想要每个文件中的实例数,您可以尝试
grep -rc regex * | grep -v ":0$"