Awk命令 - 检查模式并在输出中显示下一行模式

时间:2018-03-03 08:16:52

标签: linux shell unix awk sed

问题::

我有一个日志文件,其中包含如下信息(超过200个ERROR集)。 在这里,我想在“ERROR:AddressSanitizer”行之后找到第一个.c文件和函数。

如果你在“ERROR:”第一行之后看到这里

  • file - asfrecohandling.c
  • 功能 - ASFPotRecoHandling_Create_RecPaxSrvcComp

答案::

awk '/ERROR: AddressSanitizer/ {L = 1} L && /\.c/ {print "file:", $5; print "function:", $4; L = 0}' file
file: ../Sources/ASFServices_Process/C/asfrecohandling.c:1431
function: ASFPotRecoHandling_Create_RecPaxSrvcComp

Log ::

=================================================================
==10073==ERROR: AddressSanitizer: heap-use-after-free on address 0x7f5941fe08c0 at pc 0x7f5ed5d37de8 bp 0x7fffe6927310 sp 0x7fffe6927308
READ of size 4 at 0x7f5941fe08c0 thread T0
    #0 0x7f5ed5d37de7 in ASFPotRecoHandling_Create_RecPaxSrvcComp ../Sources/ASFServices_Process/C/asfrecohandling.c:1431
    #1 0x7f5ed5d2ef50 in ASFPotRecoHandling ../Sources/ASFServices_Process/C/asfrecohandling.c:399

我看到几个日志也有.cpp文件。现在我想使用上面的相同命令检查第一行中的.c或.cpp文件。我试过&&和||同样但没有运气

#0 0x7f5ed5d37de7 in ASFPotZXZXoHandling_KJT_RecPBVBVrvcComp ../Sources/ASFServices_Process/C/asfrecohandling.cpp:1431
#1 0x7f5ed5d2ef50 in ASFPotRecoHandling ../Sources/ASFServices_Process/C/asfrecohandling.c:399

1 个答案:

答案 0 :(得分:-1)

基本区别在于,在一个命令中查找cpp和c:

/\.c(pp)?/

问号是'可选'并且大括号说,不仅最后一个p是可选的,而且是两者的组合。

我可能会使用更严格的正则表达式:

/[ \t]#[0-9]+.*[A-Za-z0-9_-]+\.c(pp)?:[0-9]+/

这会抓取以下冒号和行号,以及源文件名,如果我没记错的话,必须符合标识符限制,并以空格,哈希标记和堆栈编号开头。

awk '/ERROR: AddressSanitizer/ {L = 1} L && /[ \t]#[0-9]+.*[A-Za-z0-9_-]*\.c(pp)?:[0-9]+/ {print "file:", $5; print "function:", $4; L = 0}' asan.err