【问题标题】:Awk command - Check for pattern and display next line of pattern in outputawk 命令 - 检查模式并在输出中显示模式的下一行
【发布时间】:2018-03-03 08:16:51
【问题描述】:

问题::

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

如果您在 "ERROR:" 行之后看到这里

  • 文件 - 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

日志::

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

【问题讨论】:

  • 欢迎来到 Stack Overflow,请在您的帖子中添加带有 CODE TAGS 的示例。
  • 因此,c/cpp-file 的行紧跟在下一行,由于行太长,被换行,或者是在下一行之一,你只是想从他们中的第一个获取内容吗?

标签: linux shell unix awk sed


【解决方案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 

【讨论】:

    猜你喜欢
    • 2017-12-06
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多