awk:仅打印特定保护行模式之后的行

awk:仅打印特定保护行模式之后的行

考虑这个文件:

#!/usr/bin/env bash
cat > example_file.txt <<EOL
|dms,wew,qwqw|
|m|head1|
|3,4,6|
|3e,2,23|
|m|head2|
|xw,12,2123|
|23,d,213|
|23,22q,2skl|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|
EOL

每隔一段时间,就会出现一个警卫模式:以以下内容开头的一行:

|m|

(是的,文件的第一行不需要是保护模式)现在我只想打印最后一个保护模式为的行:

|m|head1|

并忽略所有其他行。在其他最糟糕的情况下,我希望输出为:

#!/usr/bin/env bash
cat > desired_result_file.txt <<EOL
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|
EOL

答案1

面向正则表达式

$ awk '/^\|m\|/ {/\|head1\|/ ? p=1 : p=0} p' example_file.txt 
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|

或面向领域

$ awk -F'|' '$2 == "m" {$3 == "head1" ? p=1 : p=0} p' example_file.txt 
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|

p实际上是一个打印标志。

awk 程序由pattern {action}成对的 组成,其中action是针对记录执行的,如果pattern求值为真(非零)。您可以省略pattern- 在这种情况下{action}是针对每条记录进行求值 - 或者省略,{action}在这种情况下 awk 应用默认模式,即打印记录:后者是这里发生的事情。

相关内容