access.logから最後の日付以降を全部取得したい!(続き)

前回ログの最後の日付を取得できたんで、今回はその日付以降を切り取る方法です。
とりあえずawkを使って以下のように書きます。

  last_time="26-01-2015 07:46:05" (適当)
  tail -n 100 ./apache_test_log.log | awk -v lt="$last_time" '{if(match($0, lt".*")) {print; num=1} else if(num==1) print}'

なにをやっとるかというと、awkで"26-01-2015 07:46:05"にマッチする行を取得してそれ以降を表示してるんですね。このnumてのがそれまでの行を無視するためにあります。

ポイントはmatchの「lt".*"」の書き方。ltはただの変数です。matchは(対象, 正規表現)の書式ですが、この正規表現は//と囲んでもいいし、文字列でもいいぽいです。でも//の中だと変数(lt)変数として認識されず、ただのltて文字と思われるので、ここでは//を使わず表現してます。そして他の正規表現と組み合わせるんは横に".*"て感じで書けばいんですね。

これでとりあえず"26-01-2015 07:46:05"の出現行以降が取得できます。

あとは更新分だけを表示させるには日付の比較が必要ですね。
日付はまずエポックタイム秒にします。で普通に差分を取って0以上(ログが追記されて日付が更新されてたら)なら表示ってプログラムを組めばよさ気です。

日付変換はmacだとdateコマンドで以下のようにします。

  posix_time=$(date -j -f "%d-%m-%Y %H:%M:%S" "$last_time" "+%s")

macはOSがBSDのやつぽいのでLinuxのdateコマンドとはいろいろ書式が違うとです。

あとどうでもいいけどコマンドを実行して変数に入れるときとかはバッククウォートじゃなくて$()を使いましょう。バッククウォートだといろいろエスケープしないといけないのでawkコマンドとかではエラーが出ます。

とりあえずこれでできそうですね。