日付の名前がついたファイルを週ごとに連結する
ログファイルを扱っていると、タイトルのような需要がちょくちょく出てくる。
例えば、一週間でログインしたユーザーのみを知りたいときとか。
この場合、日付の名前がついたファイルを週ごとに連結して、sortしてuniq・・・ってことになるのだが、週ごとに連結するのは、割と面倒くさい作業である。
2週間程度なら
2014-06-05 2014-06-06 (省略) 2014-06-11 > week_2014-0611
のように手動でコマンドを打ってもいいだろう。
でも、もし、これが2ヶ月にもわたったら??
そのために自動化しようと考えてこんなスクリプトを作った。 (正直いうと、もっと楽な方法があるんじゃないかとまだ疑っている。そんな方法をご存知の方は教えていただきたい)
# author="Kensuke Mitsuzawa" # date="2014/06/11" # 日付系列を与えると、そのその日付が名前のファイルを週ごとに連結して、連結したファイルを標準出力するスクリプト #------------------------------------------------------------ start_day_of_range=$1 end_day_of_range=$2 #start_day_of_range="2014-03-03" #end_day_of_range="2014-03-30" #------------------------------------------------------------ # 入力ファイルに関する記述 input_file_prefix="ここに入力パスのprefixを記述" #------------------------------------------------------------ # 出力ファイルに関する記述 output_file_prefix="ここに出力パスのprefixを記述" #------------------------------------------------------------ end_day=`date -d"$end_day_of_range" +%s` start_day=`date -d"$start_day_of_range" +%s` diff=$(expr $end_day - $start_day) # 引き算はこう記述しないといけない diff=$(expr $diff / 86400) # 差を求めた後に割らないといけない date_seq="" for i in `seq 0 $diff` do if [ 0 -eq $i ] then date_seq=`echo ${date_seq} ${input_file_prefix}${start_day_of_range}` elif [ 6 -eq $(expr $i % 7) ] then #週の終わりの日の場合は、ファイルを連結して出力 target_date=`date --date "${start_day_of_range} ${i}days" +"%Y-%m-%d"` date_seq=`echo ${date_seq} ${input_file_prefix}${target_date}` output_file_path=$output_file_prefix$target_date cat ${date_seq} > $output_file_path date_seq="" # date_seqの初期化 else target_date=`date --date "${start_day_of_range} ${i}days" +"%Y-%m-%d"` date_seq=`echo ${date_seq} ${input_file_prefix}${target_date}` fi done exit