如何使用awk打印出最后的模式范围?

时间:2010-12-15 09:54:50

标签: awk

我的档案是这样的:

  

/开始模式/
第一场比赛
  / end pattern /

     

其他文字

     

/开始模式/
第二场比赛
  / end pattern /

     

其他文字

     

/ begin pattern /
这是我的   想打印出来/结束   图案/
其他文字

如何使用awk打印出最后一场比赛?我只知道如何打印出所有这些比赛。

3 个答案:

答案 0 :(得分:2)

取决于是否要打印包含定界符的行:

$ awk '
    /begin pattern/ { rec=""; f=1 }
    f { rec=rec $0 ORS; if (/end pattern/) {last=rec; f=0} }
    END { printf "%s", last }
' file
/begin pattern/
This is the one I want to print out
/end pattern/

或:

$ awk '
    f { if (/end pattern/) {last=rec; f=0} rec=rec $0 ORS }
    /begin pattern/ { rec=""; f=1 }
    END { printf "%s", last }
' file
This is the one I want to print out

这可确保您打印的内容是一个以begin pattern开头并以end pattern结尾的块,因此您不只是在start pattern之后没有{{1 }}(如果在输入文件的末尾存在)。如果输入中不存在匹配的块,它还可以确保您不打印空白行。

答案 1 :(得分:1)

存储当前匹配并使用END块将其打印出来:

awk '/end pattern/{flag=0} flag{m=$0} /begin pattern/{flag =1}  END{print m}' file

如果/ begin pattern /和/ end pattern /.

之间只有一行,则此方法有效

答案 2 :(得分:1)

awk 'END { print r } 
/end pattern/ { f = x }
/begin pattern/ { f = 1; r = x }
f++ > 1 { r = r ? r RS $0 : $0 }
' infile