问题::
我有一个日志文件,其中包含如下信息(超过200个ERROR集)。 在这里,我想在“ERROR:AddressSanitizer”行之后找到第一个.c文件和函数。
如果你在“ERROR:”第一行之后看到这里
答案::
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
答案 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