grep 如何抑制不匹配文件的显示?

mtk*_*mtk 14 grep search stdout command-switch

我正在尝试使用grep. 目录中有很多文件(> 500)

我运行的命令

$ grep 'delete' *
Run Code Online (Sandbox Code Playgroud)

输出

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
Run Code Online (Sandbox Code Playgroud)

这些是不包含给定匹配项的文件。我想抑制这些行显示到标准输出。我知道-qswitch,但这会抑制我不想要的完整输出。

我怎么做?

Lau*_*scu 14

添加

| grep -v ':0$'
Run Code Online (Sandbox Code Playgroud)

不是很优雅,但我认为可以完成这项工作。

添加-l到您的命令中只会为您提供匹配项,但它也会禁止打印每个文件的匹配项数。

  • grep 行应该是 `grep -v ':0$'` 这样只有在行尾的那些才匹配(但是,只要你不需要行数,`grep -l` 方法要好得多) (5认同)

小智 9

使用grep -l您只会获得包含至少一个匹配项的文件。

您是否需要有关文件中有多少匹配项的信息?因为您可以跳过 using -cwhich 用于计算文件中的匹配数。

编辑:就像术士所说的那样,使用-I抑制二进制文件中的匹配也可能是一个好主意。


Sté*_*las 9

这就是grep -c.

可能您有一个名称以字符开头-并包含c字符的文件,并且您正在使用 GNU grep 而不设置POSIXLY_CORRECT环境变量。

用:

grep -- delete *
Run Code Online (Sandbox Code Playgroud)

或更好:

grep delete ./*
Run Code Online (Sandbox Code Playgroud)

--标记选项的结尾,以便该文件名不会被视为选项(使用 POSIX grep,它不会,因为非选项delete参数会标记选项的结尾),但它不会解决问题一个名为-. 该grep delete ./*更强劲,但有输出额外的缺点./为匹配的文件(虽然可能被认为是奖金,因为这有助于确定包含换行字符的文件名)。