![grep 如何抑制显示不匹配的文件?](https://linux22.com/image/27754/grep%20%E5%A6%82%E4%BD%95%E6%8A%91%E5%88%B6%E6%98%BE%E7%A4%BA%E4%B8%8D%E5%8C%B9%E9%85%8D%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我正在尝试使用 查找包含特定单词的文件grep
。目录下文件较多(>500)
我运行的命令
$ grep 'delete' *
输出
validate_data_stage1:0
validate_data_stage2:0
validate_data_stage3:0
validate_data_stage4:0
validate_data_stage5:0
validate_input_stage1:0
validate_input_stage2:0
validate_input_stage3:0
validate_input_stage4:0
.... and hundred of such lines
这些是不包含给定匹配项的文件。我想禁止这些行显示到标准输出。我知道-q
switch,但这会抑制完整的输出,这是我不想要的。
我怎么做?
答案1
添加
| grep -v ':0$'
不是很优雅,但我认为可以完成这项工作。
添加-l
到您的命令只会为您提供匹配项,但它也会抑制打印每个文件的匹配项数。
答案2
使用grep -l
您只会获得包含至少一个匹配项的文件。
您是否需要有关文件中有多少匹配项的信息?因为您可以跳过使用-c
which来计算文件中的匹配数。
编辑:就像术士所说,使用-I
抑制二进制文件中的匹配也可能是一个好主意。
答案3
这就是 所表现出的行为grep -c
。
也许您有一个名称以字符开头-
并包含一个c
字符的文件,并且您正在使用 GNU grep 而不设置POSIXLY_CORRECT
环境变量。
使用:
grep -- delete *
或更好:
grep delete ./*
--
标记选项的结尾,以便该文件名不会被视为选项(使用 POSIX grep,则不会,因为非选项delete
参数会标记选项的结尾),但它不会解决以下问题一个名为-
.它grep delete ./*
更强大,但缺点是输出./
匹配文件的额外内容(尽管这可能被认为是一个好处,因为这有助于识别包含换行符的文件名)。
答案4
与 Laurentiu 的答案类似,您还可以使用列表-l
作为 grep 的文件输入:
grep -r "pattern" -c $(grep -rl "pattern")
它允许保留 grep 的颜色,但在后台执行相同的操作