logging - 如何使用 awk 选择多行日志条目
问题描述
我有一个日志,其中包含多行的条目。条目始终以 2019-04-05 09:32:58,543 形式的日期开头。下一个日志条目开始的唯一指标是我又有了一个日期。在第一行中还有一个唯一标识符(下面示例中的 XKcEpaUgg3QvsUTsQSuaIwAAATT)。
在https://stackoverflow.com/a/17988834/55070的帮助下,我可以想出一个非常接近的 awk 命令。该命令awk 'flag;/2019.*\| XKcEpaUgg3QvsUTsQSuaIwAAATT \|.*/{flag=1;next}/2019.*/{flag=0}' logfile
几乎可以工作。问题是它不显示日志条目的第一行,而是显示条目之后的下一行。
由于 awk 命令中的第二个模式也与第一个模式匹配,因此没有 next 的命令将只返回第一行。
日志条目的一个示例是:
2019-04-05 09:32:58,543 | some information for the first line | XKcEpaUgg3QvsUTsQSuaIwAAATT | more info |
first body line
second body line
some more information
2019-04-05 09:32:58,765 | some information for the next log entry | OTHER_ID | more info |
解决方案
$ cat tst.awk
BEGIN { FS=" [|] " }
/^[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2},[0-9]{3} / { prt(); rec=$0; next }
{ rec = rec ORS $0 }
END { prt() }
function prt( flds) {
split(rec,flds)
if ( flds[3] == tgt ) {
print rec
}
}
$ awk -v tgt='XKcEpaUgg3QvsUTsQSuaIwAAATT' -f tst.awk file
2019-04-05 09:32:58,543 | some information for the first line | XKcEpaUgg3QvsUTsQSuaIwAAATT | more info |
first body line
second body line
some more information
$ awk -v tgt='OTHER_ID' -f tst.awk file
2019-04-05 09:32:58,765 | some information for the next log entry | OTHER_ID | more info |
推荐阅读
- mysql - 模式设计 - 存储调查数据的最佳实践
- firefox - downloadhelper add-on (firefox) 正在剪切音频?
- google-bigquery - 如何使用 BigQuery 将当前行中的值除以当前行?
- apache-nifi - 比较 NiFi 中不同流量的 2 个日期
- python - 需要完全透明的“.png”文件格式
- python - 如何在 presidio 库中传递正则表达式
- vue.js - 带有 Gridsome (vuejs) 的 Pinterest 分享按钮
- php - 查找一起购买的产品 Laravel eloquent
- .net - 如何使用缓存任务缓存 Azure Pipelines 中所有项目的 nuget 包
- java - 骆驼路线发送数据后关闭Spring应用程序