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


11

我正在尝试使用来查找包含特定单词的文件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

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

我怎么做?


2
通常,grep不应打印出不匹配文件的文件名。实际上,看起来好像grep与内容0匹配的一行。您可以张贴您正在使用的确切搜索模式吗?
阿德里安·海涅

我使用的完整grep cmd为grep 'delete' * -R,但我认为不会-R引起任何问题。是的,它通常不会打印出不匹配的内容,但不知道这里是什么情况……
mtk 2012年

@step @everyone .. Strange ...看完上面编辑的帖子后。我尝试过grep -- 'delete' *(添加了--),并且按预期方式工作。卸下将--导致以上显示。
mtk 2012年

1
@Stephane确实你是对的。我搜索了目录...,并且有一个名为name的文件-ci。感谢您解决问题。您可以将此方案发布为答案。
mtk 2012年

Answers:


9

这就是展示的行为grep -c

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

采用:

grep -- delete *

或更好:

grep delete ./*

--标记选项的结束,这样该文件名将不被视为选项(使用POSIX grep时,不会,因为non-option delete参数将标记选项的结束),但是它不能解决以下问题:名为的文件-。这样grep delete ./*做更健壮,但缺点是输出额外./的文件以匹配文件(尽管这可能被认为是额外的选择,因为这有助于识别包含换行符的文件名)。


12

| grep -v ':0$'

不太优雅,但我认为可以胜任。

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


1
-l工作了。解决方法也很好。谢谢
mtk

4
grep行应该是grep -v ':0$'这样,以便仅匹配行尾的行(但是,grep -l只要不需要行数,此方法会更好)
mreithub 2012年

9

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

您是否需要有关文件中有多少个匹配项的信息?因为您可以跳过使用-c哪个来计数文件中的匹配数。

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


0

如何grep非零计数:

grep -rIcH 'string' . | grep -v ':0$'

  • -r 递归子目录。
  • -I忽略二进制文件(感谢@tongpu和warlock
  • -c显示比赛数。令人讨厌的是,包含0个文件。
  • -H 显示文件名,即使只有一个文件也是如此。
  • 'string' 你的绳子去了。
  • . 从当前目录开始。
  • | -v ':0$'删除0个文件。(感谢@LaurentiuRoescu

(我意识到OP是无意中的-c计数,但是google(grep非零计数)落在此处。)


0

与Laurentiu的答案类似,您也可以将清单-l用作grep的文件输入:
grep -r "pattern" -c $(grep -rl "pattern")
它允许保留grep的颜色,但在后台执行相同的操作


请注意,包含任何空格或通配符的文件名和目录将因此被错误地拆分和匹配。
杰夫·谢勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.