毎週月曜日に1度、直近1週間分のアクセスログを取得し、その中からクライアントIPを抽出するという作業を行なっています。
こちらの処理で月末・月初に限り、一週間区切りではなく、その1週間のうち月末分と月初分で分けて集計を行いたいのですがどのようにシェルスクリプト内に処理の記述すればよいかわからずみなさまにお力をお借りしたく今回質問させていただきました。
例えば2020年9月7日集計日の場合
1、2020年8月31日
2、2020年9月1日-9月6日
と上記のように先月末と残り月初で期間を2つに分けて処理を行なうイメージです。
流れとしましては以下①②コマンドを使用し
-accessログが置いてあるディレクトリ内から対象期間のログをリスト化(logfile_list.txt-date '+%Y%m%d'
)
-その後リストに書かれているファイルのパスを一行ずつ指定してファイルの内容をcatコマンドとawkコマンドで抽出
上記で抽出されたものをIPリスト(output.iplist.txt-date '+%Y%m%d'
)としています。
①、対象期間のログをリストファイル化
for i in `seq 1 7` ;do ls /var/log/nginx_log/*access*`date '+%Y%m%d' --date "$i day ago "` >> /var/tmp/logfile_list.txt-`date '+%Y%m%d'` ;done ※ログファイル名フォーマット access.log-yyyymmdd ssl=access.log-yyyymmdd
②、①で取得したリストでファイルの内容を出力しIPの個所のみ抽出(重複分は削除)
for i in $(cat /var/tmp/logfile_list.txt-`date '+%Y%m%d'`) ;do awk -F',' '{print $2}' $i | tr -d ' client: '| sort | uniq >> /var/tmp/output.iplist.txt-`date '+%Y%m%d'` ;done
こちらを記載したシェルスクリプトをcronで毎週月曜日に実行されるように設定しています。
月末月初以外だと月が変わらず1週間分のIPを取得できるのですが、上記の処理内容だと仮に2020年9月7日に集計のスクリプトが実行された場合抽出されたIPリストに2020年9月1日-9月6日と2020年8月31日分が混ざったアクセスIPが出力される形になります。
自動で毎週集計されるという仕組みは変えずに、ファイルの中身に処理を追記して月末・月初は先月末分と月初分で処理を分けてくれる処理の書き方をご存じの方はお力をお貸しいただけると大変助かります。
出力されるファイルが複数になってしまっても構いません。
文章が読みづらく申し訳ないのですがよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー