shell - 如何使用 awk 打印具有特定模式的开始和结束标记之间的记录?

标签 shell awk

例如,对于以下消息,我只想提取以“Receiving message”开头、以“Processed”结尾、中间有“Overriden”的消息。

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/

相关文章:

arrays - Bash 中的多维数组

linux - 尝试放置错误变量时如何修复 Tcl 'Command not found' 错误?

regex - awk 连接字符串直到包含子字符串

bash - 从awk中的CSV文件计算按列分组的总和

python - 为什么文件权限在 Python 和 bash 中显示不同?

Python 无法识别 MacPorts 安装包

awk - 可以设置全局 AWK 分隔符

awk - 在文件名中与模式匹配的特定位置插入文本

mysql - 使用 shell 脚本向 MYSQL 表中插入数据

linux - 将 shell 的输出重定向到带有&符号的文件会在输出中返回一些额外的命令