シェルでログファイル名を操作

ログファイルをシェルを使って管理することになっている。このファイル名をいじくりまわす時に色々なやり方があるが、特によく使った2つについてメモ。
ここでは、ローテーションして圧縮したっぽい、次のログファイル名を例として用いる。

_file_full_name="abc_12345678.log_20110812.gz"
1) ファイル名から特定の文字列を抽出する

ほんと、sed さんは便利で、正規表現で ( ) 内に一致した値を“\1、\2、…”で参照できる。
ログファイル名に、ローテーションなりアーカイブなり圧縮した日付をつけて管理している時には、よく使うと思う。

# _file_full_nameの(最後に一致する)数値8桁
_file_yyyyMMdd=`echo ${_file_full_name} | sed -e "s/.*\([0-9]\{8\}\).*/\1/g"`

“20110812”が取得できる。

2) ファイル名をメイン部分と拡張子に分割する

ほんと、展開の演算子くんは便利で、コレだけでいける。

# _file_full_name の末尾にマッチした文字列のうち、最短の文字列を削除
_file_main_name=`echo ${_file_full_name%.*}`

# _file_full_name の先頭にマッチした文字列のうち、最長の文字列を削除
_file_extention=`echo ${_file_full_name##*.}`

“abc_12345678.log_20110812”と“gz”が取得できる。
まぁ、、これだけ*1

*1:なんだけど、これでまた5年くらいシェル書かないからさ、きっと。基本的なことすら忘れるわけよ。