查找包含多个字符串的文件

het*_*ean 3 unix string search grep find

我使用一个命令递归地查找包含某个文件的文件string1

find . -type f -exec grep -H string1 {} \;
Run Code Online (Sandbox Code Playgroud)

我需要查找包含多个字符串的文件,因此该命令应返回包含所有字符串的文件。像这样的东西:

find . -type f -exec grep -H string1 AND string2 {} \;
Run Code Online (Sandbox Code Playgroud)

我找不到办法。字符串可以位于文件中的任何位置。即使只有两个字符串的解决方案也会很好。

Ben*_* W. 6

您可以链接您的操作,并使用第一个操作的退出状态,仅在第一个操作成功时才​​执行第二个操作。(省略原色之间的运算符默认为-and/ -a。)

find . -type f -exec grep -q 'string1' {} \; -exec grep -H 'string2' {} \;
Run Code Online (Sandbox Code Playgroud)

第一个 grep 命令使用-q“quiet”,如果找到该字符串,它会返回成功的退出状态。

要收集包含的所有文件,然后只需调用一次 grep 即可string1运行搜索,您可以使用:string2-exec ... {} +

find . -type f -exec grep -q 'string1' {} \; -exec grep 'string2' {} +
Run Code Online (Sandbox Code Playgroud)


Mus*_*GRU 5

你也可以试试这个;

find . -type f -exec grep -l 'string1' {} \; | xargs grep -l 'string2'
Run Code Online (Sandbox Code Playgroud)

这显示包含 string1 和 string2 的文件名

  • 这是一个非常好的解决方案。我建议用单引号将“{}”括起来,并使用“xargs”的“-d”参数来避免由于文件名带有空格而导致的错误,如下所示:“find . -type f -exec grep -l 'string1' '{}' \; | xargs -d '\n' grep -l 'string2'` (2认同)
  • 我还建议使用“+”而不是“\;”来结束 find 命令的“-exec”选项。这将使用单个 grep 命令搜索尽可能多的文件,减少将运行的进程数量,从而更快地获得结果。 (2认同)

Sun*_*eep 5

与 GNUgrep

grep -rlZ 'string1' | xargs -0 grep -l 'string2'
Run Code Online (Sandbox Code Playgroud)


man grep

-r, --递归

仅当符号链接位于命令行时,才以递归方式读取每个目录下的所有文件。请注意,如果未给出文件操作数,grep 将搜索工作目录。这相当于 -d 递归选项。

-Z, --null 输出零字节(ASCII NUL 字符),而不是通常跟在文件名后面的字符。例如,grep -lZ 在每个文件名后输出一个零字节,而不是通常的换行符。即使文件名包含换行符等异常字符,此选项也使输出明确无误。此选项可与 find -print0、perl -0、sort -z 和 xargs -0 等命令一起使用来处理任意文件名,甚至包含换行符的文件名。