[英]How to Search in Linux if ERROR changes to INFO in logs for a particular ID
我有一个日志如下。 我只需要过滤掉 ERROR state 中重复出现 REQ ID 的 ERROR 行。
对于以下情况中的示例,预期 output 是 REQ3,因为它在第 3 行的错误 state 中,重试后再次出现错误。 (可以无限次重试,但我们可以检查它是否在一天中连续出现错误)对于 REQ2,它在第 2 行的错误 state 中,但在第 5 行中更改为 INFO,因此预计不会在 output 中出现。
....
yyyy-mm-dd [INFO] REQ1 Context 1
yyyy-mm-dd [ERROR] REQ2 Context 2
yyyy-mm-dd [ERROR] REQ3 Context 3
yyyy-mm-dd [INFO] REQ1 Context 4
yyyy-mm-dd [INFO] REQ2 Context 5
yyyy-mm-dd [ERROR] REQ3 Context 6
....
一种快速的解决方案可能是首先找到打印了非错误消息的所有请求 ID。 您可以使用以下方法来执行此操作:
假设你的日志在text.txt
grep -v "\[ERROR\]" test.txt | cut -d ' ' -f 3 | tr '\n' '|'
这将导致您不想用|
分隔的所有事件 ID .您可以在完整日志文件的反向 grep 操作中使用此管道分隔的字符串列表,以仅保留您需要的内容。
┌─[dspataro@dspataroarchazzo]─(/tmp)
└─[15:17]--[$] grep -v "\[ERROR\]" test.txt | cut -d ' ' -f 3 | tr '\n' '|'
REQ1|REQ1|REQ2|
┌─[dspataro@dspataroarchazzo]─(/tmp)
└─[15:17]--[$] R="REQ1|REQ1|REQ2"
┌─[dspataro@dspataroarchazzo]─(/tmp)
└─[15:17]--[$] cut -d ' ' -f 3 test.txt | sort | uniq | grep -E -v "$R"
REQ3
这个awk
命令应该可以完成这项工作:
awk '
{ if ($2=="[ERROR]") errors[$3]; else cleared[$3] }
END { for (id in errors) if (!(id in cleared)) print id }
' file
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.