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

时间:2017-01-12 17:17:12

标签: linux bash shell grep

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

Toast.makeText(this, Integer.toString(paths.size()),Toast.LENGTH_SHORT).show();

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

3 个答案:

答案 0 :(得分:4)

GNU grep模式下使用PCRE,启用-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

有关-M页面中的标记-Bman pcregrep的更多信息,

  

-M, - 多线                    允许模式匹配多行。给出此选项时,模式可能有用地包含文字换行符和内部                    出现^和$字符。成功匹配的输出可能包含多行,最后一行是其中的一行                    比赛结束。如果匹配的字符串以换行符结尾,则输出结束于该行的末尾。

     

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

答案 1 :(得分:1)

如果要在整个目录中进行递归搜索,请扩展@Inian的最佳答案:

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

此特定命令将在except文件中查找包含pass的出现行,紧随其后的是包含.py的行。

答案 2 :(得分:0)

#!/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