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

今回やりたいこと。
apacheaccess.logから最後の日付以降を全部取得したい!
で、もし新しくファイルが更新されたら、更新された分だけを表示させたい!

アルゴリズム的ななにか
1.ログファイルの最後の日付を取得(sedで特定の文字列を抽出ってやつ)
2.とりあえずそれをなんかの変数に入れておく
3.またログファイルの最後の日付を取得してもし更新されてたら差分を表示

こう。。表示としては最初にバーンて30行くらい表示されて、以降は差分のみが表示されていく的なね。

やったこと
まずaccess.logをcatしてそれをechoして一行にします。そしてそれをsedして最後の日付を取得します。(日付は23-01-2015 07:39:19な形式と想定)

tmp_log=`cat ./apache_test0_log.log`;
last_time=$(echo $tmp_log | sed -e "s/.*\(..-..-.... ..:..:..\).*$/\1/")

結果(例)
23-01-2015 07:39:19

ちょっと説明すると、まず最初のechoで全部の文字を一行にしてます。(大事なことなので)
でいま23-01-2015 07:39:19な感じの日付が途中にいくつも含まれてる一行のファイルになってます。
それをsedで置換してるわけですが、
初めの「.*」がまぁどんな文字でもってやつ
次の「\(..-..-.... ..:..:..\)」はこういう感じの文字があるば真?て感じ。この中で「.」は任意の一文字で「- :」はそのままの文字です。
最後の「.*$」行末まで任意の文字てやつ。

ポイントは「.*」で、これって一番大きく当てはまるやつが適用されるんですよ。
つまり、\(..-..-.... ..:..:..\)の形式のやつが途中にいくつあろうが、それらは任意の文字列ってのに解釈されまして、一番最後の\(..-..-.... ..:..:..\)だけが適用されるんですぽい。
何を言ってるかわからねーだろうが俺も(ry

で、\(..-..-.... ..:..:..\)のかっこなんですが、これはグループ化っていうらしく、後方参照ができるんですね。つまり\(..-..-.... ..:..:..\)で当てはまったやつは後ろで参照できるんですよ。
ここでいう後ろてのは置換後の文字としてってことです。
sedの書式は/置換文字/こう置換する文字/オプションなんで、こう置換する文字のとこで使えるんですね。それが\1てやつです。一応このかっこは後方参照のためのやつで、置換文字としてはなんの影響もないです。

このグループ化のやつはよく文字列を抽出する時に使うって書かれてるんで紛らわしいんですが、結局これも置換してるだけです。
つまり上のやつは「.*\(..-..-.... ..:..:..\).*$」に当てはまったやつを「\(..-..-.... ..:..:..\)」の部分に置き換えてるんですね。だから結果的に文字が抽出できてるって感じです。

ようやくこれで最後の日付が抽出できたか。。

そういえばどうでもいいけどいっつもecho 文字列 | grep "抽出文字"みたいな感じで使ってるんですが、grepとかawkとかsedてファイルからじゃないと読み込めないじゃないですか。
つまりまぁこのパイプってやつがさもファイルから呼んでるようにしてくれてるんですね。grepには無名一時ファイルに記述された文字列が渡されてる感じらしいです。

今まで無我夢中でecho 文字列 | と書いてきたがちょっとパイプのことがわかった気がする。
ちなみにcat ファイル | grepだと上でも書いたけどgrepには無名ファイルで改行付きで渡してくれます。
ちなみちなみにcat ファイル | xargs grepてするとgrepにはファイルの中身が一行ずつファイル名として渡されます。そんな役目がxargsにはあります。

ちょっとクリーニングのやつ取りにいかないといけないので、続きはまた次回。