使用 grep 获取关键字存在的文件数

使用 grep 获取关键字存在的文件数

我正在尝试获取目录中具有匹配关键字的文件的数量。我使用的代码是:

grep -r -i --include=*.sas 'keyword'- 这给出了关键字的总数。

grep -l "keyword" --include="*.sas" * | wc -l- 该代码不起作用。

任何人都可以帮助我,如何获取包含关键字的文件的数量。

答案1

我个人会使用find和 一起grep进行计数:

find . -type f -name '*.sas' -exec grep -q -e 'pattern' {} \; -exec echo x \; |
wc -l

如果您不想递归到子目录,请-maxdepth 1在第一个目录之前添加。-execfind

其作用是对当前目录或以下目录中带有文件名后缀grep -q -e 'pattern'的每个文件运行。.sas对于每个匹配的文件patternx将由 输出echo xecho然后用 来统计这样输出的行数wc -l。我们计算xes 而不是文件名 with,wc因为文件名可能包含换行符。

对于非递归变体,您还可以选择简单的 shell 循环:

for name in ./*.sas; do
    [ ! -f "$name" ] && continue
    grep -q -e 'pattern' "$name" && echo x
done | wc -l

或者,

n=0
for name in ./*.sas; do
    [ ! -f "$name" ] && continue
    grep -q -e 'pattern' "$name" && n=$((n + 1))
done
echo "$n"

如果您的pattern不是正则表达式而是字符串,请改用grep -q -F -e 'string'

答案2

find $DIR  -type f  -name '*.sas'  -exec grep -m1 -e 'pattern' {} \; | wc -l

使用 -m1 选项,grep每个文件最多输出 1 行,这样就会为wc -l您提供包含该模式的正确文件数。

答案3

grep -rl --include='*.sas' keyword . | wc -l

只要文件路径不包含换行符就可以工作。

要使用这些,您需要切换到 NUL 分隔的记录而不是行:

grep -rlZ --include='*.sas' keyword . | tr -cd '\0' | wc -c

(请注意,-r/ -Z/--include是非标准扩展名,并且*.sas无法匹配包含未在语言环境中形成有效字符的字节序列的文件名(例如$'st\xe9phane.sas'UTF-8 语言环境中的 a))。

答案4

\grep -rh -i -m1 --include='*.sas' -e 'pattern' |wc -l

-h: 不输出文件名。不会在包含换行符的文件/路径上中断。
-m1:一旦找到第一个匹配,就停止读取文件的其余部分
-r:递归
-i:不区分大小写的匹配
-e:使用 PATTERN 作为图案;-如果它出现在模式的开头,请避免将其视为 grep 开关标识符。


我在 AU 上也有一个答案,我认为看一下并使用它来快速查看您想了解的每个开关是有用的,而不是从以下位置查看/滚动man grep

相关内容