例如,对于以下消息,我只想提取那些以“接收消息”开头,以“已处理”结尾,中间有“覆盖”的消息。
Receiving message
Processing
Processed
dummy 1
dummy 2
Receiving message
Processing
Overriden
Processed
dummy 3
dummy 4
Receiving message
Processing
Processed
dummy 5
预期产量:
Receiving message
Processing
Overriden
Processed
以下内容将获取范围,但是如何通过匹配“ Overriden”来再次过滤并打印中间的所有行?
awk '/Receiving message/,/Processed/'
请注意,在“已处理”和下一个“接收消息”之间还有其他行,并且不需要这些行。
最佳答案
这已经被问过并回答了一千遍了,但是写答案要比寻找答案容易,所以这里又是:
$ cat tst.awk
/Receiving message/ { f=1 }
f {
buf = buf $0 ORS
if ( /Processed/ ) {
if ( buf ~ /Overriden/ ) {
printf "%s", buf
}
f=0
buf=""
}
}
$ awk -f tst.awk file
Receiving message
Processing
Overriden
Processed
关于shell - 如何使用awk在开始标记和结束标记之间以特定模式打印记录?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48640908/