我有一个日志,其中的条目跨越多行。条目始终以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命令中的第二个模式也与第一个模式匹配,因此没有下一个命令的命令只会返回第一行。
日志输入的一个示例是:
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 |
答案 0 :(得分:4)
$ 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 |
答案 1 :(得分:3)
您可以使其更简单:
date_ptn='^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]:[0-5][0-9],[0-9]{3}'
myid="XKcEpaUgg3QvsUTsQSuaIwAAATT"
awk -v id="$myid" -v date_ptn="$date_ptn" -F' \\| ' '$0 ~ date_ptn{p = $3 == id ? 1 : 0}p' file.txt
#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行中的$0 ~ date_ptn{ p=id==$3 }p
。