我有一个应用程序服务的日志文件,我正试图提取其中一个子进程转储的堆栈跟踪。堆栈跟踪的模式与通常的日志文件完全不同。
常见的Web应用程序日志文件条目:
2020-03-26 08:31:05.000 : INFO : (18582) : (SERVICE) : MSG_1234 : Process id 98765. Standard output and error:
堆栈跟踪的示例:
7f318820d000-7f318a106000 rwxp 00000000 00:00 0 [stack:10002]
7f318a106000-7f318a107000 ---p 00000000 00:00 0
我需要提取堆栈跟踪,我可以做到。堆栈跟踪的问题是它们以相反的顺序转储。每个转储的块都是按顺序排列的,但这些块是按相反的顺序转储的。
以下是我如何提取块的示例(注意:开始和停止模式在同一行(:
echo "STOP message START
five
six
STOP message START
three
four
STOP message START
one
two
STOP message" | awk '/START/ {flag=1; next} flag; /STOP/ {flag=0}'
这是输出:
five
six
three
four
one
two
STOP message
虽然,我想得到这个:
one
two
three
four
five
six
我可以接受匹配的最后一条"STOP消息",但我需要按顺序排列块。
如果您从这个开始对每个块和每个块中的行进行编号,然后可以使用sort
对行进行排序,然后删除使用cut
:添加的数字
$ awk -v OFS='t' '/STOP/{lineNr=0} lineNr{print blockNr, lineNr++, $0} /START/{blockNr++; lineNr=1}' file
1 1 five
1 2 six
2 1 three
2 2 four
3 1 one
3 2 two
例如:
$ awk -v OFS='t' '/STOP/{lineNr=0} lineNr{print blockNr, lineNr++, $0} /START/{blockNr++; lineNr=1}' file |
sort -k1,1nr -k2,2n
3 1 one
3 2 two
2 1 three
2 2 four
1 1 five
1 2 six
$ awk -v OFS='t' '/STOP/{lineNr=0} lineNr{print blockNr, lineNr++, $0} /START/{blockNr++; lineNr=1}' file |
sort -k1,1nr -k2,2n | cut -f3-
one
two
three
four
five
six