Awk:在同一行的图案之间打印,并颠倒匹配字符串的顺序



我有一个应用程序服务的日志文件,我正试图提取其中一个子进程转储的堆栈跟踪。堆栈跟踪的模式与通常的日志文件完全不同。

常见的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

最新更新