在两个图案之间打印线条,多次出现第二个图案

时间:2018-05-23 09:14:50

标签: linux shell awk sed

我有一个如下文件,我想打印两个给定模式PAT1和PAT2之间的线。

()

这里PAT1出现一次,但PAT2出现多次。我想在PAT1和PAT2的第3次出现之间打印行

我使用以下命令在模式之间打印,在这种情况下不起作用

1
2
PAT1
3    
4
PAT2
5
6
PAT2
7    
PAT2
8
9
PAT2
10    

我期待以下输出

awk '/PAT1/PAT2/'

我该怎么做?

4 个答案:

答案 0 :(得分:3)

显然这有效:

$ awk '/PAT1/,/PAT2/&&++c==3' file
PAT1
3 
4
PAT2
5
6
PAT2
7 
PAT2

请参阅有关其工作原理的评论。

答案 1 :(得分:0)

我认为这就是你想要的。

$cat file | awk 'BEGIN{foundPAT1=0; foundPAT2=0;} {if($0=="PAT1"){foundPAT1=1;next} if($0=="PAT2"){foundPAT2+=1;next} if(foundPAT2==3)exit; if(foundPAT1) print;}'

这将等到它找到PAT1,然后打印直到找到PAT2 3次并退出该文件。 这将从输出中排除PAT *,您可以通过删除" next"来包含它们。声明,使awk跳到下一行。

答案 2 :(得分:0)

关注awk可能会有所帮助。在此解决方案中,您可以给出要打印行的出现次数,因此在这种情况下,我已经给出了值-v occur=3,您可以根据需要将其更改为。

awk -v occur="3" '/PAT1/{flag=1} flag; /PAT2/{count++} flag && count==occur{flag=""}'  Input_file

OR(如果你想在第3次出现PAT2之前打印东西)除了PAT2字符串,然后运行以下。

awk -v occur="3" '/PAT1/{flag=1} /PAT2/{count++} flag && count==occur{flag=""} flag'  Input_file

答案 3 :(得分:0)

使用sed

sed -E '/PAT1/!d;:A;N;/((.*PAT2){3})/!bA' infile