我需要从一个尚未清除的文件中找到警报记录。要做到这一点,我需要从警报id(第4列)检查,它从来没有被标记为清除。
逻辑:打印已设置并清除的警报。在第4列中,每个告警都有一个唯一的告警标识符。有时,一些警报器可能会升级到更高的严重程度,然后才被清除。例如,在接下来的输入中,ID 102最初是次要的,但是它首先升级到关键,最后被清除。
不需要的警报:
102---set
102---Escalated to critical
102---Cleared 或
103---set
103---cleared警报器的输出需要
104---set
104---NEVER CLEARED样本输入:
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期望产出:
2017-05-23T05:45:47 node-4 CRITICAL 104 alarm_text3我试过了但没有帮助:
grep -v 'CLEARED'
awk '!a[$4]++'发布于 2017-05-24 06:32:55
另一种awk解决方案:
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发布于 2017-05-24 06:27:56
您可以使用下面这样的Awk逻辑,
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它将产生一个输出,如
2017-05-23T05:45:47 node-4 CRITICAL 104 alarm_text3这里的想法是将特定警报的所有状态存储为哈希映射,由警报id键控,这样一旦处理了所有行,您就会得到如下信息:
102 MINOR CRITICAL CLEARED
103 MAJOR CLEARED
104 CRITICAL这里的关键不是查找状态的单个实例,如果警报从一种状态过渡到另一种状态,这可能会提供错误信息。所以检查一下政府,CLEARED是不是有正确的方法。
https://stackoverflow.com/questions/44150354
复制相似问题