我想使用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