我正在尝试获取目录中具有匹配关键字的文件的数量。我使用的代码是:
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
在第一个目录之前添加。-exec
find
其作用是对当前目录或以下目录中带有文件名后缀grep -q -e 'pattern'
的每个文件运行。.sas
对于每个匹配的文件pattern
,x
将由 输出echo x
。echo
然后用 来统计这样输出的行数wc -l
。我们计算x
es 而不是文件名 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
: