首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从bash或awk打印未清除警报

从bash或awk打印未清除警报
EN

Stack Overflow用户
提问于 2017-05-24 06:16:19
回答 2查看 35关注 0票数 2

我需要从一个尚未清除的文件中找到警报记录。要做到这一点,我需要从警报id(第4列)检查,它从来没有被标记为清除。

逻辑:打印已设置并清除的警报。在第4列中,每个告警都有一个唯一的告警标识符。有时,一些警报器可能会升级到更高的严重程度,然后才被清除。例如,在接下来的输入中,ID 102最初是次要的,但是它首先升级到关键,最后被清除。

不需要的警报:

代码语言:javascript
复制
102---set
102---Escalated to critical
102---Cleared 

代码语言:javascript
复制
103---set 
103---cleared

警报器的输出需要

代码语言:javascript
复制
104---set
104---NEVER CLEARED

样本输入:

代码语言:javascript
复制
2017-05-23T05:45:41 node-1 MINOR    102 alarm_text1
2017-05-23T05:45:43 node-2 MAJOR    103 alarm_text2
2017-05-23T05:45:41 node-1 CRITICAL 102 alarm_text1   #Escalation
2017-05-23T05:45:47 node-4 CRITICAL 104 alarm_text3
2017-05-23T05:45:51 node-1 CLEARED  102 alarm_text1
2017-05-23T05:45:43 node-2 CLEARED  103 alarm_text2

期望产出:

代码语言:javascript
复制
2017-05-23T05:45:47 node-4 CRITICAL 104 alarm_text3

我试过了但没有帮助:

代码语言:javascript
复制
grep -v 'CLEARED'

awk '!a[$4]++'
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-24 06:32:55

另一种awk解决方案:

代码语言:javascript
复制
awk -v s="CLEARED" '$3!=s{a[$4]=$0} $3==s{delete a[$4]} END{for (i in a) print a[i]}' file

2017-05-23T05:45:47 node-4 CRITICAL 104 alarm_text3
票数 1
EN

Stack Overflow用户

发布于 2017-05-24 06:27:56

您可以使用下面这样的Awk逻辑,

代码语言:javascript
复制
awk '{alarm[$4]=(alarm[$4] FS $3); text[$4]=$0; next}END{for (i in alarm) if (!match(alarm[i],/CLEARED/)) print text[i] }' file

它将产生一个输出,如

代码语言:javascript
复制
2017-05-23T05:45:47 node-4 CRITICAL 104 alarm_text3

这里的想法是将特定警报的所有状态存储为哈希映射,由警报id键控,这样一旦处理了所有行,您就会得到如下信息:

代码语言:javascript
复制
102  MINOR CRITICAL CLEARED
103  MAJOR CLEARED
104  CRITICAL

这里的关键不是查找状态的单个实例,如果警报从一种状态过渡到另一种状态,这可能会提供错误信息。所以检查一下政府,CLEARED是不是有正确的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44150354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档