使用grep以递归方式找到包含字符串“a”AND字符串“b”的所有文件

时间:2014-03-21 13:51:34

标签: linux string recursion grep find

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

grep -Rn "myString" *

我想知道是否有人会如此善良地教我如何搜索多个 递归地在同一文件中的字符串。也就是说,我想找到所有两者" String1" " String2。"

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

我一直在尝试几件事而没有成功。我想在基本目录中开始搜索,并递归搜索所有子目录。如果有人可以帮助我,我会非常感激。

3 个答案:

答案 0 :(得分:4)

将您的第一次搜索结果再次发送到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'

答案 1 :(得分:3)

您可以find级联支票:

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

答案 2 :(得分:0)

grep --null -rl String1 . | xargs -0 grep --null -l String2 | xargs -0 grep -n -e String1 -e String2

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