如何grep多行

如何grep多行

我想找到所有包含两行的文件:abcdef。例如,

xxx
111abc
yyy
222def333

该文件应该被捕获,grep因为它包含abcdef

我应该怎么办?我已经尝试过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}输出符合条件的文件

相关内容