在文件中查找单词并验证最后 3 次出现的值

在文件中查找单词并验证最后 3 次出现的值

我正在对日志中的单词“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

相关内容