【问题标题】:Grep Search all files in directory for string1 AND string2grep 在目录中的所有文件中搜索 string1 AND string2
【发布时间】:2011-05-15 14:58:18
【问题描述】:

如何在 cygwin 中使用 grep 查找所有包含 BOTH 字词的文件。

这是我用来递归搜索目录中所有文件的一个单词:

grep -r "db-connect.php" .

如何扩展上述内容以查找同时包含“db-connect.php”和“版本”的文件。

我试过这个:grep -r "db-connect.php\|version" . 但这是一个 OR,即它获取包含其中一个或另一个的文件。

感谢大家的帮助

【问题讨论】:

标签: linux shell grep


【解决方案1】:
grep -r db-connect.php . | grep version

【讨论】:

  • 太棒了,谢谢。返回的文件似乎比我预期的要少。正在调查...
  • 这不会错过它们都在文件中但在不同行的情况吗?
  • 是的,@lathomas64。
【解决方案2】:

grep "db-connect.php" * |切-d:-f1 | xargs grep "版本"

我没有在递归模式下尝试过,但应该是一样的。

【讨论】:

  • 这不会返回两个字符串都在的文件,它会返回一个或另一个。对吗?
  • 嗯,不,它应该返回包含这两个字符串的所有文件(那些字符串在不同的行上)。试试: grep "db-connect.php" * |切-d:-f1 | xargs grep "版本" | cut -f1 -d: 只有文件名...
  • 最后一个命令很有用,有助于确认我需要检查的文件。所以谢谢。 +1。
  • 有一个类似的情况,这很有效,除非第一个 grep 只返回一个文件,然后没有从 xargs grep 获得文件名,只是第二个字符串
【解决方案3】:

你的意思是“string1”和“string2”在同一行吗?

grep 'string1.*string2'

在同一行但顺序不定?

grep '(string1.*string2)|(string2.*string1)'

或者两个字符串都必须出现在文件中的任何位置?

grep -e string1 -e string2

【讨论】:

  • 最后一个与grep 'string1\|string2' 相同,是OR 而不是AND
【解决方案4】:

使用 PCRE(Perl 兼容的正则表达式)进行多行匹配并返回包含两个字符串(AND 而不是 OR)的文件的文件名。

grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' .

【讨论】:

    【解决方案5】:

    and 一起进行多次搜索,使用多个前瞻断言,除了最后一个之外,每件事都查找一个:

    而不是写

    grep -P A  * | grep B
    

    你写

    grep -P '(?=.*A)B' *
    
    grep -Pr '(?=.*db-connect\.php)version' .
    

    不要写

    grep -P 'A.*B|B.*A' *
    

    因为在重叠时会失败,而 (?=…)(?=…) 技术不会。

    您也可以添加NOT 运算符。要搜索与X 不匹配的行,您当然通常在命令行上使用-v。但如果它是更大模式的一部分,你就不能这样做。如果是,则将(?=(?!X).)*$) 添加到模式中以排除其中包含X 的任何内容。

    所以假设你想匹配所有三个 A、B、然后是 C 或 D 的行,但是其中没有 X 或 Y。你只需要这个:

    grep -P '(?=^.*A)(?=^.*B)(?=^(?:(?!X).)*$)(?=^(?:(?!Y).)*$)C|D' *
    

    在某些 shell 和某些设置中。如果 ! 是你的历史替代字符,你将不得不转义它。

    这样,是不是很酷?

    【讨论】:

      【解决方案6】:

      在我的 cygwin 中,给定的答案不起作用,但以下是:

      grep -l firststring `grep -r -l secondstring . `
      

      【讨论】:

        【解决方案7】:

        如果你想 grep 查找文件中具有不同行的多个字符串,请使用以下命令:

        grep -rl expr1 | xargs grep -l expr2 | xargs grep -l expr3
        

        这将为您提供包含 expr1、expr2 和 expr3 的文件列表。

        请注意,如果目录中的任何文件名包含空格,这些文件将产生错误。这可以通过在 grep 和 xargs 中添加 -0 来解决。

        【讨论】:

        • 为了使用空分隔符来处理带有空格字符的文件名:grep -rl -Z expr1 | xargs -0 grep -l -Z expr2 | xargs -0 grep -Z -l expr3.
        【解决方案8】:

        为什么只坚持 grep:

        perl -lne 'print if(/db-connect.php/&/version/)' *
        

        【讨论】:

          猜你喜欢
          • 2016-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多