如何使用多个选项来匹配多个模式

时间:2016-09-22 13:58:00

标签: linux bash awk grep

我需要使用带有多个模式和多个选项的grep过滤文本文件:

grep -e "QUESTION" -e "Query" file.txt

以上情况有效,但我需要添加一些选项,如-A

grep -e -A3 "QUESTION" -e -A5 "Query" file.txt

2 个答案:

答案 0 :(得分:3)

您可以使用简单的黑客在awk中执行此操作,grep不支持此操作。

awk -v var1=4 -v var2=6 '/QUESTION/{while (count<var1) line[NR+count] count++;} \
    /Query/{count=0;while (count<var2) line[NR+count] count++; }; NR in line' file.txt

此处awk变量var1var2控制需要打印多少行包括模式。与grep -A标记类似,但值为+。

您可以在下面看到它的示例文件: -

$ cat file.txt
QUESTION
a
bc
c
d
e
f
Query
a1
bc2
c3
d4
e5
f5
foo

现在使用值46

运行命令
$ awk -v var1=4 -v var2=6 '/QUESTION/{while (count<var1) line[NR+count] count++; } \
     /Query/{count=0;while (count<var2) line[NR+count] count++; }; NR in line' file.txt
QUESTION
a
bc
c
Query
a1
bc2
c3
d4
e5

这可以扩展到任意数量的搜索模式。

答案 1 :(得分:2)

使用

sed '/QUESTION/{N;N;N;p};/Query/{N;N;N;N;N;p};d' file.txt

使用

perl -ne 'BEGIN{$p=0;};$p=4if/QUESTION/;$p=6if/Query/;$p&&do{print;$p--}' file.txt

......但我更喜欢这个:

perl -ne 'BEGIN{%search=("QUESTION"=>3,"Query"=>5);$p=0;$sre=join("|",keys%search);};
          $p=1+$search{$1}if/($sre)/;$p&&do{print;$p--}' file.txt

perl -ne '
    BEGIN{
        %search=(
            "QUESTION"=>3,
            "Query"=>5
        );
        $p=0;
        $sre=join("|",keys%search);
    };
    $p=1+$search{$1} if /($sre)/;
    $p && do { print; $p--: }
' file.txt

通过这种方式,您可以轻松添加或删除包含行数的搜索字符串。

...最后,就在创建专用工具之前:

perl -ne 'BEGIN{ %search=@ARGV;@ARGV=();$sre=join("|",keys%search);};
        $p=1+$search{$1} if /($sre)/;$p&&do{print;$p--;}' <file.txt Query 5 QUESTION 3

使用 V4.3或更高版本:

( tee >(grep -A5 Query >&5) | grep -A3 QUESTION >&5) 5>&1 <file.txt | cat

command | ( tee >(grep -A3 Query >&5) | grep -A5 QUESTION >&5) 5>&1 | cat

添加最后一个fifo似乎可以减少混音问题...