例如,对于以下消息,我只想提取那些以“接收消息”开头,以“已处理”结尾,中间有“覆盖”的消息。

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/

10-12 15:33