我尝试编写一个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之外的其他错误?如果是这样,会引发错误"。
另外,我无法控制日志文件格式,它来自我们的客户端。
关于如何做到这一点的任何想法?
答案 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
这很快且很脏,只适用于单个折叠线,但似乎整理了您的示例日志文件片段。