【问题标题】:Recursively locate all files that have string "a" AND string "b" using grep使用 grep 递归查找具有字符串“a”和字符串“b”的所有文件
【发布时间】:2014-04-28 22:26:43
【问题描述】:

我一直在使用以下命令递归搜索目录中的字符串。

grep -Rn "myString" *

我想知道是否有人会教我如何搜索多个 递归地在同一个文件中的字符串。也就是说,我想找到所有具有both“String1”“String2”的文件名。

如果我能知道包含两个字符串的文件中每个字符串的行号,那就太好了。

我一直在尝试几件事,但都没有成功。我想在基本目录中开始搜索并递归地向下搜索所有子目录。如果有人可以帮助我,我将不胜感激。

【问题讨论】:

    标签: linux string recursion grep find


    【解决方案1】:

    再次将您的第一次搜索结果传送到grep

    grep -RlZ "String1" . | xargs -0 grep -l "String2"
    

    这将列出同时包含String1String2 的文件。

    获取包含这两个字符串的文件的行号可能效率不高,因为您需要先验。一种方法是将结果再次通过管道传输到grep

    grep -RlZ "String1" . | xargs -0 grep -lZ "String2" | xargs -0 grep -En 'String1|String2'
    

    【讨论】:

    • 某事grep --null | xargs -0?
    • @kojiro 处理疯狂的文件名?
    • 我总是在处理疯狂的文件名。 Mac、Windows 和 Unicode,天哪!
    • +1; OSX 用户(我知道问题被标记为“linux”,但这种技术通常很有用):使用 --null 而不是 GNU 简写 -Z
    【解决方案2】:

    您可以让find 为您级联检查:

    find . -type f -exec fgrep -q 'myString1' {} \; \
                   -exec fgrep -q 'myString2' {} \; \
                   -exec fgrep -q 'myString3' {} \; \
                   -print
    

    【讨论】:

    • +1;不知道对初级排序意味着与它们短路(换句话说:序列中的给定初级(-exec-print)仅在所有前面的评估为真时才执行)。为了满足 OP 的要求也打印出行号,按照 @devnull 的示例,您可以将 -print 替换为 -exec fgrep -Hn -e "myString1" -e "myString2" -e "myString3" {} \;
    【解决方案3】:
    grep --null -rl String1 . | xargs -0 grep --null -l String2 | xargs -0 grep -n -e String1 -e String2
    

    有几种方法可以做到这一点,但由于您需要具有两个匹配字符串的文件,您可以找到一个匹配的文件名,然后重新扫描它们以获得第二个。第一个 grep 查找具有第一个模式的文件名;第二个重新扫描这些文件中的第二个字符串。最后,第三个 grep 打印出匹配的行号。

    【讨论】:

      猜你喜欢
      • 2013-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多