ファイル内の単語を見つけて、その値が最後の3回表示されることを確認してください。

ファイル内の単語を見つけて、その値が最後の3回表示されることを確認してください。

ログで「percent」という単語を検索しています。

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番目のフィールドを比較し、必要な文字列を印刷します。

答え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

関連情報