匹配第一个模式并在与其他模式匹配后获得所有输出

时间:2015-10-11 13:50:24

标签: bash awk

如何匹配,然后在其他匹配的第n个匹配后获得输出? 含义:

    boo <-first match pattern
    art <- second pattern
    foo
    art
    art
    two

我希望得到“嘘声”和所有事情,直到第二次出现“艺术”:

    boo
    art
    foo
    art

另外,如果第二种模式是空白/换行,我们该怎么做? ;) awk会很有趣..

谢谢!

3 个答案:

答案 0 :(得分:1)

使用awk之类的内容:

awk 'BEGIN{s1=s2=0} $1=="boo"{s1=1} s1==1 && s2<2 {print} $1=="art"{s2++}'  file.txt

答案 1 :(得分:0)

awk知道行号,所以:

awk 'NR==2{p2=$0}{print}NR>2&&$0==p2{exit}'

或者,如果boo是一些固定的模式,但艺术是嘘之后的任何东西:

awk '$0=="boo"{n=NR}n&&NR-n==1{p2=$0}{print}n&&NR-n>1&&$0==p2{exit}'

或者如果boo和art都是固定模式:

awk '$0=="boo"{n=NR}n&&NR-n==1&&$0=="art"{p2=$0}{print}n&&NR-n>1&&$0==p2{exit}'

最后,如果第一个boo和art不需要相邻,你想(反复)打印模式中的所有线条(并且只有那些线条)“boo ... art ... art “:

awk '!n&&$0=="boo"{n=1}n{print}n==2&&$0==p2{n=0}n==1&&$0=="art"{n=2;p2=$0}'

答案 2 :(得分:0)

实际上,使用Awk进行这种操作非常容易。我认为你选择了正确的工具。 但盲目地使用该工具更糟糕,我想你可以检查一些Awk http://goo.gl/NkUP3y的基础知识,而不是谷歌搜索单行解决方案或排序。

这是我的快速测试,以满足您的要求并且有效。

⇒ cat test
boo
art
foo
art
art
two
⇒ awk 'BEGIN {m2=0} /boo/ {m1=1; print; next} { if ($1 ~ /art/) { if (m2==1) {print; exit} else { m2=1 }  }  } { print }' test
boo
art
foo
art

希望这是你想要的。