如果找到匹配,则在两个模式之间打印文本

时间:2014-11-18 19:53:40

标签: regex awk sed grep

我有一个包含多个重复模式的文件。 如果在每个匹配模式之间找到匹配,我想打印相关信息。

例如:

START PATTERN1 pat1
START PATTERN2 pat2
text1 0
text2 2
text3 8
text4 10
STOP PATTERN2 pat2
STOP PATTERN1 pat1
START PATTERN1 pat3
START PATTERN2 pat4
text1 0
text2 2
text3 10
text4 10
STOP PATTERN2 pat4
STOP PATTERN1 pat3

我想从START PATTERN1开始搜索 如果我发现text3 8存在 我需要打印pat1pat2作为发生这种情况的指标。

所以我可以使用此比赛前的开始或此比赛后的停止。

但我不想做任何事情。

所以从上面的文件我会运行命令,输出将是: PAT1 PAT2

因为这是唯一包含" text3 8"内。 有什么帮助吗?

1 个答案:

答案 0 :(得分:0)

这是你期望的吗?

awk '
    $0 ~ "START PATTERN1"{l=1}
    l==1 && $0 ~ /^text3 8$/{l++}
    l==2 && $1 == "STOP"{print $NF}
' file

根据你的评论,只有当text3为8但

时才会打印出来
$ awk '
    $0 ~ "START PATTERN1"{l=1}
    l==1 && $0 ~ /^text3 [^8]$/{l++}
    l==2 && $1 == "STOP"{print $NF}
' file

使用

$ perl -00lne '
  foreach $count (1..2) {
  print $1 if
  /START\s+PATTERN${count}.*^text3\s+8\s*\n.*?STOP\s+PATTERN${count}\s+(\w+)/ms}
' file