解析日志文件以获取错误消息

时间:2014-10-14 18:41:36

标签: bash grep find

我尝试编写一个bash命令,能够根据特定模式的日志文件扫描设置变量(exitStatus)。

在日志文件中,可能存在许多错误消息。问题是那一个 错误消息有时写在两行上。例如:

ERROR 77: Invalid record detected at position 88332: bad alignment 
detected [IRD-21]
ERROR 77: Invalid record detected at position 88333: bad alignment 
detected [IRD-21]
ERROR 77: Invalid record detected at position 88334: bad alignment 
detected [IRD-21]
ERROR 77: Invalid record detected at position 88335: bad alignment 
detected [IRD-21]
ERROR 88: Bad format in string at record 287 [SYN-44]
ERROR 88: Bad format in string at record 288 [SYN-44]
ERROR 88: Bad format in string at record 289 [SYN-44]
ERROR 73: Invalid table spec or stub at record 1022 [INVT-33]

如果日志文件仅包含与ERROR 77 [IRD-21]相关的消息,或者根本没有错误,那么它很好,exitStatus保持为0.否则,exitStatus设置为2. / p>

我一直在尝试使用find和grep,但错误信息可能会分布在两行上这一事实正在摧毁我的努力。简单地说,我想问一下shell:"嘿,bash,日志文件是否包含除IRD-21之外的其他错误?如果是这样,会引发错误"。

另外,我无法控制日志文件格式,它来自我们的客户端。

关于如何做到这一点的任何想法?

3 个答案:

答案 0 :(得分:1)

如果您只是想知道单词ERROR后面是77以外的其他内容,那么您可以(使用GNU grep):

exitStatus=$(grep -qP 'ERROR (?!77)' sample.log && echo 2 || echo 0)

答案 1 :(得分:1)

此命令基本上会删除以ERROR 77开头并以21]

结尾的行
sed -i.bak '/ERROR 77*/ {N; /ERROR 77.*21\]/d }' log_file

然后,您可以将grep命令与新日志文件一起使用,以查找日志文件中是否还有其他错误消息

exit_status=$(grep  -q "ERROR" log_file && echo 2 || echo 0)

答案 2 :(得分:0)

这里尝试连接不以ERROR开头的行,这样你就可以过滤掉ERROR 77:s。

awk '!/^ERROR/ && n { print; n=0; next }
    n { printf "\n" }
    { printf "%s", $0; n=1 }' log

这很快且很脏,只适用于单个折叠线,但似乎整理了您的示例日志文件片段。