gpt4 book ai didi

regex - 如何从日志文件中 grep 错误但过滤掉错误警报?

转载 作者:行者123 更新时间:2023-12-05 08:48:01 25 4
gpt4 key购买 nike

目标是获得如下输出,其中包含每个文件的文件名和错误计数。

/var/log/file2.log:5
/var/log/file3.log:7
/var/log/file5.log:3
/var/log/file7.log:2

假设有很多名为“*.log”的日志文件,并且所有文件的格式如下。

2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.ClassAAAA      : real error
2021-03-16 01:01:01.001 INFO 1234 --- [main] com.example.ClassAAAA : message
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.LibBB : real error
2021-03-16 01:01:01.001 INFO 1234 --- [main] com.example.LibBB : message
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.ClassCCCCCC : real error
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.ClassCCCCCC : real error
2021-03-16 01:01:01.001 INFO 1234 --- [main] com.example.ClassCCCCCC : message
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.ClassD : false alert
2021-03-16 01:01:01.001 INFO 1234 --- [main] com.example.ClassD : message
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.LibEEE : false alert
2021-03-16 01:01:01.001 INFO 1234 --- [main] com.example.LibEEE : message
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.LibFFFFF : false alert
2021-03-16 01:01:01.001 ERROR 1234 --- [main] com.example.LibFFFFF : false alert
2021-03-16 01:01:01.001 INFO 1234 --- [main] com.example.LibFFFFF : message

主要问题是有一些已知的错误警报不应计算在内。

例如,我们希望统计除ClassD 之外的任何类记录的错误。 , LibEEELibFFFFF通过以下命令。

grep -Pc '^.* ERROR .*((?<!(ClassD|LibEEE|LibFFFFF)).)*$' *.log | grep -v :0

但它不起作用,并打印出以下错误。

grep: lookbehind assertion is not fixed length

如果有效,上面示例日志片段的计数将为 4,由 ClassAAAA 记录, LibBBClassCCCCCC分别。

更新

衷心感谢大家花时间分享您的想法。我进入 lookbehind 的思考集的原因是我最初想用“\s*:”来限定类名,但最终错过了空格和冒号。

虽然目前可以实现目标,但很好奇 - 在这种情况下是否可以使用 lookbehind?

最佳答案

这应该是 awk 的任务,请您尝试执行以下操作。使用 GNU awk 中显示的示例编写和测试。您可以将多个文件传递给此命令,它将逐个文件地打印文件(文件名和错误计数如示例所示)。

awk '
BEGIN{ OFS=":" }
FNR==1{
if(count){
print FILENAME,count
}
count=0
}
/ERROR/ && !/ClassD|LibEEE|LibFFFFF/{
count++
}
END{
if(count){
print FILENAME,count
}
}
' *.log

说明: 为以上添加详细说明。

awk '                        ##Starting awk program from here.
BEGIN{ OFS=":" } ##Setting OGFS to colon in BEGIN section of this program.
FNR==1{ ##Checking condition if this is first line then do following.
if(count){ ##Checking if count is not null then.
print FILENAME,count ##Printing file name with OFS and count value here.
}
count=0 ##Setting count to 0 here.
}
/ERROR/ && !/ClassD|LibEEE|LibFFFFF/{ ##checking condition if line does not contain ClassD, LibEEE and LibFFFFF then do following.
count++ ##Increase count with 1 here.
}
END{ ##Starting END block of this program from here.
if(count){ ##Checking if count is not null then.
print FILENAME,count ##Printing file name with OFS and count value here.
}
}
' *.log ##Passing all .log files to program here.

关于regex - 如何从日志文件中 grep 错误但过滤掉错误警报?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66652755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com