![在文件中查找单词并验证最后 3 次出现的值](https://linux22.com/image/157287/%E5%9C%A8%E6%96%87%E4%BB%B6%E4%B8%AD%E6%9F%A5%E6%89%BE%E5%8D%95%E8%AF%8D%E5%B9%B6%E9%AA%8C%E8%AF%81%E6%9C%80%E5%90%8E%203%20%E6%AC%A1%E5%87%BA%E7%8E%B0%E7%9A%84%E5%80%BC.png)
我正在对日志中的单词“percent”执行 grep
strings /var/lib/activemq/data/gc.log |grep percent | grep ten
这给了我一个输出
<mem type="tenure" free="2188996168" total="2617245696" percent="83" />
我需要检查最后的实例并报告
CRITICAL is between 10 and 0
WARNING is between 20 and 10
OK status if the usage is over 20
现在我做了strings /var/lib/activemq/data/gc.log |grep percent | grep ten |tail -5 | awk {'print $5'}
当前输出是,我知道这个数字会有所不同
percent="24"
percent="24"
percent="24"
percent="23"
percent="23"
如何只考虑最后 3 个值来返回 OK、CRITICAL 或警告状态?
答案1
我们可以用 awk 来做到这一点。
awk -F '"' '/percent/ && /ten/ {if( $(NF-1) > 20 ) {print "OK" } else if ( $(NF-1) < 20 ) {print "WARNING" } else if ( $(NF-1) < 10 ) { print "CRITICAL" }}' /var/lib/activemq/data/gc.log
-F '"'
双引号作为字段分隔符/percent/ && /ten/
grep 具有模式的行。( $(NF-1) > 20 )
比较倒数第二个字段并打印需要的字符串
答案2
您awk
只能使用:
awk '
/ten/ && /percent/ {
match($0,"percent=\"([^\"]*)",m)
if (m[1] < 10) print "CRITICAL"
else if (m[1] < 20) print "WARNING"
else print "OK"
}' file | tail -n3
但对于 XML 数据,最好使用 xml 解析器:
last_percents=$(
xmlstarlet select -t -m '//mem[@type="tenure"]' -v '@percent' -n < file \
| tail -n3
)
for i in $last_percents; do
if [ $i -lt 10 ]; then echo "CRITICAL"
elif [ $i -lt 20 ]; then echo "WARNING"
else echo "OK"
fi
done