コマンドで linux サーバー内の溜まったログから必要なデータを一括で抽出


AWS の EC2 に溜まったログ

現在のサービスでは, アクセスログが logs ディレクトリ以下に access.log-20190101.gz といったように日付などで記録されています。
中身は, 以下のような構成になっていました。
gz なので, zcatコマンドで確認できます。
その前に root ユーザーでログインしてからのほうがいいですね

sudo -s

zcat access.log-20190101.gzの結果です。

access.log-20190101.gz
172.1*.**.* - - [01/Jan/2019:13:29:31 +0000] "GET /index HTTP/1.1" 200 16
172.1*.**.* - - [01/Jan/2019:13:29:31 +0000] "GET /done HTTP/1.1" 200 16
172.2*.**.* - - [01/Jan/2019:13:29:31 +0000] "GET /index HTTP/1.1" 200 16
172.2*.**.* - - [01/Jan/2019:13:29:31 +0000] "GET /menu HTTP/1.1" 200 16
172.2*.**.* - - [01/Jan/2019:13:29:31 +0000] "GET /lp HTTP/1.1" 200 16

今回このデータの中から欲しかったログは, doneページまでたどり着いたユーザーの確認がしたいため, プライベートIPアドレスと日付と referer が必要です。

ログの吐き出し

今回は, 複数のログを確認したいため, ログを一つずつ実行していきます。

for log in `find logs/ -name access.log*.gz`;do ........

次にアクセスログの中から done ページまでたどり着いた特定の ip を抽出します。awk コマンドでプライベート ip アドレスと referer のセットを作成し, referer から /done にたどり着いたユーザーの ip アドレスを $ip に格納していきます。

for ip in `zcat $log | awk '{print $1,$5}' | 'grep /done' | awk print'{$1}'`;do .....

上記を用いてそれぞれのログから, それぞれの /done にたどり着いた ip アドレスの行動を収集します。その結果を root ディレクトリ内の result.log に吐き出します。

for log in `find logs/ -name access.log*.gz`;do for ip in `zcat $log | awk '{print $1,$5}' | 'grep /done' | awk print'{$1}'`;do zcat $log | awk '{print $4,$1,$5}' | grep $ip;done;done > ~/result.log

サーバーのファイルをローカルに持ってくる

最後にローカル側で scp コマンドを使ってファイルをダウンロードしてきます。詳しい情報はぐぐってみてください。

scp インスタンス情報:~/result.log ./

お疲れさまでした。一文でできるのは快適ですが, 普通にシェルスクリプト作成してもよかったかもですね〜