在两条连续线上搜索两个图案,并在匹配前打印n行



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

1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234

当我找到这样一个匹配时,我想在匹配前打印它,包括N行。有什么想法吗?谢谢

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

grep -ozP ".*abc.*n.*def.*" file

pcregrep用于输入文件

cat file
1234
abc-noise
6789
abc-noise
def-noise
def-noise
1234
noise-abc-noise
noise-noise-def

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

pcregrep -M  'abc.*n.*def' file 
abc-noise
def-noise
noise-abc-noise
noise-noise-def

对于模式匹配之前的行,使用-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

关于来自man pcregrep页面的标志-M-B的更多信息,

-M,--multiline允许图案与多行匹配。当提供此选项时,模式可能有用地包含文本换行符和内部出现^和$字符。成功匹配的输出可能由多行组成,最后一行是比赛结束。如果匹配的字符串以换行序列结束,则输出将在该行的末尾结束。

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

扩展@Inian的伟大答案,如果你想递归搜索整个目录:

find my_code_dir/ -type f  -name "*.py" -exec pcregrep -B2 -M  'except.*n.*pass' {} +

此特定命令将查找包含except的行,然后紧跟着包含pass的行,但仅在.py文件中。

#!/bin/bash
a=''
b=''
while read c; do
a=$b;
b=$c;
if [ `echo "$a" |grep "abc"` ] & [ `echo "$b" |grep "def"` ]; then
echo $a;
echo $b;
break;
fi
done

启动:

$./find2pat
wegweg
egwergwerg
sdfabcerg
rrheedef4

输出:

sdfabcerg
rrheedef4

最新更新