首页 > 解决方案 > 如何使用 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 |

标签: loggingawk

解决方案


$ 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 |

推荐阅读