変数内に複数の検索する文字列があるかチェックするシェルスクリプト

2018-12-17

概要

特定の文字列やエラーなどの文字列が変数内のあったら、処理をわけるという処理が必要なスクリプトを作る機会があったので、そのスクリプトを紹介します

スクリプトは、以下の様な感じの処理です

  1. egrepコマンドで検索する文字列をOR検索します。
  2. その検索結果の文字をwcコマンドでバイト数を集計しています
  3. if文で、バイト数に応じて処理をわけています

使用例1(変数に特定記号(/, !)などあるか確認)

変数内のスラッシュ(/)ビックリマーク(!)などの記号があるとその後の処理で、誤動作しそうな場合に、変数内に特殊な記号があるか確認する場合などに使用する場合です。

今回のスクリプトでは紹介していませんが、きちんと正規表現で定義すればメールアドレス・ドメインなどの文字列チェック(RFC規則にあっているか)にも応用できるかと思います

 

スクリプトでは、変数のMOJIに記号文字(/, #, !)があるかegrepコマンドでチェックしています。
その結果をwc -cコマンドでバイト数を集計しています。
その文字列が含まれない場合のCHKMOJIの変数には「0」が返ります。その文字列が含まれる場合は「0」以外の数字となるので、if文で処理を分けています

MOJI=hoge/hoge

# 変数(MOJI)内に「/, #, !」がある確認して、文字列のバイト数を集計
CHKMOJI=`echo $MOJI | egrep '/|\#|\!' | wc -c`

# if文で処理を分岐、「/, #, !」が含まれている場合は、処理を抜けます
if [ $CHKMOJI -eq 0 ] ; then
  echo "$CHKMOJI OK"
else
  echo "$CHKMOJI NG"
  echo "$CHKMOJI に「/, #, !」が含まれいますので処理を止めます"
  exit
fi

使用例2(ログに特定文字列(error, fail)などあるか確認)

特定のログにエラーなどがある場合は、アラートを表示したりメールしたりするスクリプトです。実際のログ監視で使用する場合は、前回の確認した際の差分を考えたりしてもう少し複雑な内容になるかと思います。

処理の内容は、上記のスクリプト(使用例1)と同じような処理なので割合します

#検索するログとエラー内容を出力するファイルを変数に定義します
LOGFILE=/var/log/hoge.log
ERRORLOG=/var/tmp/hoge_error.log

#ログファイルにエラーが無いか確認し、その文字列がバイト数を集計します
LOGCHK=`cat $LOGFILE | egrep -i "emerg|alert|crit|error|warn|fail" | wc -c`

if [ $LOGCHK -eq 0 ] ; then
  echo "$LOGFILE OK"
else
#エラーの場合は、エラーファイルにエラー内容を出力します
  echo "$LOGFILE NG"
  cat $LOGFILE | egrep -i "emerg|alert|crit|error|warn|fail" > $ERRORLOG

#エラー内容を本文、変数(MAIL_TITLE)をタイトルとしてメールします
  MAIL_TITLE="$LOGFILE ALERT"
  cat $ERRORLOG | /bin/mail -s "$MAIL_TITLE" admin@hoge.com

fi

 

スポンサーリンク