実務であるアプリのログをまとめるスクリプトを書きました。
log1.log
log2.log
log3.log
・・・・
みたいにローテーションして吐かれていくのですが、量が多いので1日分をまとめることに。log-20170323みたいにまとめたいとします。
ここでシェルスクリプトの出番です。「特定日が最終更新日時のファイルを更新日時順にソートし、1つのログファイルとして出力」というのが要件になります。
たったこれだけなんですがそこそこ苦労しました。解説はコメントで。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#!/bin/bash TARGET_DIR='ログが入っているディレクトリのパス' #1日前を設定しています。 target_date=`date --date '1 day ago' +%Y%m%d` UPDATE_FROM="${target_date} 00:00" UPDATE_TO="${target_date} 23:59" EXPORT_FILE_PATH='ファイルのディレクトリ' EXPORT_FILE_NAME="${EXPORT_FILE_PATH}ファイル名称-${target_date}.log" #特定日が最終更新日時のファイルの取り方は下記の通り #時間ダブルクオートでくくらないとエラーにまする #find ${TARGET_DIR} -newermt ${UPDATE_FROM} ! -newermt ${UPDATE_TO} #xargs ls -ltrで更新日順に並べる #この書き方で一気にfile_listに配列が格納される #xargs --no-run-if-emtpyを書けばファイルがないときにカレントディレクトリが表示されてしまうことがない #awkでファイル名だけを取り出す file_list=`find $TARGET_DIR -type f -newermt "$UPDATE_FROM" ! -n ewermt "$UPDATE_TO" | xargs --no-run-if-empty ls -ltr | awk '{print $9}' ` #対象ファイルを一気に吐き出して結合 for single_file in $file_list; do cat $single_file >> ${EXPORT_FILE_NAME} done |
参考リンク
配列への格納
シェルスクリプトでfindした結果を配列で受け取る