代码之家  ›  专栏  ›  技术社区  ›  Abs

grep搜索目录中的所有文件以查找string1和string2

  •  18
  • Abs  · 技术社区  · 15 年前

    如何利用cygwin中的grep查找包含 两个 话。

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

    grep -r "db-connect.php" .
    

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

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

    谢谢你的帮助

    8 回复  |  直到 9 年前
        1
  •  20
  •   Kevin    13 年前
    grep -r db-connect.php . | grep version
    
        2
  •  4
  •   Alexander McNulty    9 年前

    如果要对具有不同行的文件中的多个字符串进行grep,请使用以下命令:

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

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

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

        3
  •  3
  •   jzrk    15 年前

    grep“db connect.php”*cut-d:-f1 xargs grep“版本”

    我没有在递归模式下尝试它,但应该是相同的。

        4
  •  3
  •   tchrist    15 年前

    and 将多个搜索放在一起,使用多个lookahead断言,除了最后一个外,每项搜索一个:

    而不是写作

    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' *
    

    在某些外壳和某些设置中。你必须逃离 ! 如果它是您的历史替换字符。

    那,不是很酷吗?

        5
  •  3
  •   incircuitous    13 年前

    在我的Cygwin中,给出的答案不起作用,但以下内容起作用:

    grep -l firststring `grep -r -l secondstring . `
    
        6
  •  1
  •   glenn jackman    15 年前

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

    grep 'string1.*string2'
    

    在同一行但顺序不确定?

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

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

    grep -e string1 -e string2
    
        7
  •  1
  •   Dennis Williamson    15 年前

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

    grep -Plr '(?m)db-connect\.php(.*\n)*version|version(.*\n)*db-connect\.php' .
    
        8
  •  0
  •   Vijay    13 年前

    为什么只坚持grep:

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