Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在两个图案之间打印第二个图案多次出现的线条_Linux_Shell_Awk_Sed - Fatal编程技术网

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

Linux 在两个图案之间打印第二个图案多次出现的线条,linux,shell,awk,sed,Linux,Shell,Awk,Sed,我有一个如下的文件,我想打印两个给定模式PAT1和PAT2之间的行 1 2 PAT1 3 4 PAT2 5 6 PAT2 7 PAT2 8 9 PAT2 10 这里PAT1出现一次,但是PAT2出现多次。我想打印第1页和第3页第2页之间的行 我使用下面的命令在图案之间打印,但在这种情况下不起作用 awk '/PAT1/PAT2/' 我期望以下输出 PAT1 3 4 PAT2 5 6 PAT2 7 PAT2 我该怎么做呢?我想这就是你想要的 $cat

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

1
2
PAT1
3    
4
PAT2
5
6
PAT2
7    
PAT2
8
9
PAT2
10    
这里PAT1出现一次,但是PAT2出现多次。我想打印第1页和第3页第2页之间的行

我使用下面的命令在图案之间打印,但在这种情况下不起作用

awk '/PAT1/PAT2/'
我期望以下输出

PAT1
3    
4
PAT2
5
6
PAT2
7    
PAT2

我该怎么做呢?

我想这就是你想要的

$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,然后打印,直到找到3次PAT2并退出文件。 这将从输出中排除PAT*,您可以通过删除“next”语句将其包括在内,这将使awk跳转到下一行。

显然这是可行的:

$ awk '/PAT1/,/PAT2/&&++c==3' file
PAT1
3 
4
PAT2
5
6
PAT2
7 
PAT2
请参阅有关其工作原理的评论。

使用sed

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

你为什么需要猫?难道你不知道如何用awk读取文件吗?当然你可以这样做(例如,请参阅其他答案),但也许你想将上一个命令的输出传递给awk,而不是“cat file |”在这里表示的文件。这真的是一样的…您的输入是否可以提取多个
PAT1..PAT2..PAT2..PAT2
。。。想不到的为什么这样做有效?我理解语法,但我看不出这是如何适合输出的。@kvantour这是一次纯粹的尝试,曾经不是错误:有一些相关的文档吗?它是有效的,但我不确定这是否是一个呆滞的错误。在手册页中写着:
表达式的pattern1,pattern2形式称为范围模式。它匹配所有输入记录,从匹配pattern1的记录开始,一直到匹配pattern2的记录为止(包括pattern2)。它不与任何其他类型的模式表达式组合。
它不与任何其他类型的模式表达式组合。它似乎与gawk、mawk、bwk和Busybox awk一起工作。
运算符的优先级最低。因此,您编写的代码被解释为
/PAT1/,(/PAT2/&&&++c==3)
。这正是“范围”模式起作用的原因。
结束模式
仅在第三个匹配的
PAT2
中命中一个true。这不奇怪吗!