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)
我找不到办法。字符串可以位于文件中的任何位置。即使只有两个字符串的解决方案也会很好。
您可以链接您的操作,并使用第一个操作的退出状态,仅在第一个操作成功时才执行第二个操作。(省略原色之间的运算符默认为-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)
你也可以试试这个;
find . -type f -exec grep -l 'string1' {} \; | xargs grep -l 'string2'
Run Code Online (Sandbox Code Playgroud)
这显示包含 string1 和 string2 的文件名
与 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 等命令一起使用来处理任意文件名,甚至包含换行符的文件名。