列出与特定正则表达式匹配的所有文件以及匹配数

列出与特定正则表达式匹配的所有文件以及匹配数

我想在目录(和任何子目录)中搜索其内容与特定正则表达式匹配的文件,并且对于每个匹配的文件,我想列出正则表达式在该文件中匹配的次数。

例如,如果文件是

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$"

相关内容