在两个连续行上搜索两个模式并在匹配前打印 n 行

yor*_*rgo 1 linux bash shell grep

我想使用 shell 命令对匹配两种不同模式的两个连续行进行 grep 或搜索,例如匹配 line1:“abc”,用于 line2:“def”。因此,对于以下文本,应该有一个匹配项:第 4 行和第 5 行。

1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
Run Code Online (Sandbox Code Playgroud)

当我找到这样的匹配时,我想在匹配之前打印它,包括 N 行。有任何想法吗?谢谢。

Ini*_*ian 5

GNU grepPCRE模式下使用,-P启用标志,

grep -ozP ".*abc.*\n.*def.*" file
Run Code Online (Sandbox Code Playgroud)

使用pcregrep为输入文件

cat file
1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def
Run Code Online (Sandbox Code Playgroud)

对于多行模式匹配,请执行

pcregrep -M  'abc.*\n.*def' file 
abc-noise
def-noise
noise-abc-noise
noise-noise-def
Run Code Online (Sandbox Code Playgroud)

对于模式匹配之前的行,请使用-B标志GNU grep

pcregrep -B2 -M  'abc.*\n.*def' file 
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def
Run Code Online (Sandbox Code Playgroud)

更多关于标志-M-Bman pcregrep页,

-M, --multiline 允许模式匹配多于一行。当给出这个选项时,模式可能有用地包含文字换行符和 ^ 和 $ 字符的内部出现。成功匹配的输出可能包含多行,最后一行是匹配结束的那一行。如果匹配的字符串以换行序列结尾,则输出在该行的末尾结束。

-B number, --before-context=number 在每个匹配行之前输出上下文的行数。如果正在输出文件名和/或行号,则使用连字符分隔符代替上下文行的冒号。在每组行之间输出包含“--”的行,除非它们实际上在输入文件中是连续的。