我想找到所有包含两行的文件:abc
和def
。例如,
xxx
111abc
yyy
222def333
该文件应该被捕获,grep
因为它包含abc
和def
。
我应该怎么办?我已经尝试过grep -rE 'abc.*def' /dir/
,但没有成功。
答案1
grep
模式--null-data
( )的一个更简化的版本-z
是使用贪婪量词来匹配任意数量的新行,如下所示
grep -ozP 'abc(.*\n.*){1,}def' file
或者使用 pcregrep(由PCRE项目) 默认情况下使用 PCRE 正则表达式功能。启用-M
多行匹配模式。
pcregrep -M 'abc(.*\n.*){1,}def' file
答案2
在 GNU 系统上,如果匹配的相对顺序并不重要,这将完成两种模式的工作:
grep -rlZ abc /dir/ | xargs -r0 grep -l def
如果您的模式多于两个,您可以将其链接起来:
grep -rlZ abc /dir/ | xargs -r0 grep -lZ def | xargs -r0 grep -l xxx
或使用find
:
find /dir/ -type f -exec grep -q abc {} \; -exec grep -q def {} \; -print
这不是很有效,还有另一个工具grep
可能更适合该任务。
答案3
对于您可能有更复杂条件的情况,我们可以使用 Awk
awk 'BEGIN{RS="\0"}
/def/ && /abc/ {print FILENAME}' *
在哪里:
RS="\0"
定义文件中不存在的寄存器分隔符(=slurp 文件)并且condition {print FILENAME}
输出符合条件的文件