正規表現による時間検証

正規表現による時間検証

ログ ファイルの 1 つについてタイムスタンプの検証を行いたいのですが、case ステートメントの式に問題があるようです。

TIME値は11:49や2011のような値になるかもしれません。そして、それがHH:MM形式かどうかを確認したいのです。コードは以下の通りです。
ファイルはHH:MM形式ですが、常に年形式になっています。

#!/usr/bin/ksh
TIME=`ls -lrth  /var/log/*.log |  grep -i upg | tail -1 | awk '{print $8}'`
echo "$TIME"
validation=false
if [[ $TIME != "" ]]
 then
  case TIME in
     "[0-23]+ :[0-59]")
        validation=true
        break;;
  *) echo "Year format";;
esac
fi

echo "$validation

更新: 「[0-2][0-9]:[0-5][0-9]」を試しましたが、検証は失敗を返します。

答え1

問題は、[0-23]+ :[0-59]式で TIME をチェックできないことです。

それを実行するにはいくつかの方法があります:

  • 変数を分割し、各部分を個別にチェックするには:
TIME="06:25" ; 
[[ $TIME != "" ]] && \
[ ${TIME%:*} -le 23 -a ${TIME%:*} -ge 0 -a \
        ${TIME#*:} -le 59 -a ${TIME#*:} -ge 0 ] && echo ok
  • 一般的な正規表現でチェックしますが、間違った時間 (28:59 など) が受け入れられる場合もあります。
"[0-2][0-9]:[0-5][0-9]")

関連情報