アクセスログ解析

May 14, 2018

はじめに

アクセスログ解析に役立ちそうなコマンドの使用方法についてまとめる。(一部違うけど)
例として取り上げるアクセスログは Application Load Balancer のアクセスログとする。

ALB のアクセスログのエントリは以下のようになっている。

http 2018-05-14T03:52:14.205764Z app/LogChance-Frontend/5b4d7e7b8487ead6 126.199.87.122:26609 10.1.11.207:32786 0.001 0.001 0.000 200 200 384 6964 “GET http://logchance.apple-amazon.jp:80/ HTTP/1.1” “Mozilla/5.0 (iPhone; CPU iPhone OS 1112 like Mac OS X) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0 Mobile/15B202 Safari/604.1” - - arn:aws:elasticloadbalancing:ap-northeast-1:967951649083:targetgroup/logchance-frontend/c7754367dd5ecb1d “Root=1-5af907ee-7c12a0fd2464c6d53a922e7d” ”-” ”-” 0 2018-05-14T03:52:14.204000Z “forward”

コマンドたち

cut

cut は各行から指定したフィールドを取り出すコマンド。-c で文字位置を指定したり、-d でデリミタ、-f でフィールドを指定できる。
例えば、Client/Server IP 及び Status Code のみを取得するには以下のようにする。

$ cut -d " " -f 4,5,9 alb_access_log.log | head -10  
223.71.238.24:62539 - 400  
126.199.87.122:26609 10.1.11.207:32786 200  
126.199.87.122:26609 10.1.11.207:32785 200  
223.71.238.24:62542 - 400  
126.199.87.122:26609 10.1.11.207:32783 200  
223.71.238.24:62543 - 400  
125.92.89.186:13581 - 400  
126.199.87.122:26609 10.1.11.207:32786 200  
126.199.87.122:26609 10.1.11.207:32785 200  
126.199.87.122:26609 10.1.11.207:32783 200  

join

join は 2 つのファイルを読み込み、共通のフィールドを持つ行を連結する。

$ cat sample1.txt   
01 aaaa  
02 bbbb  
04 cccc  
$ cat sample2.txt   
01 AAAA  
02 BBBB  
05 CCCC  
$ join -j 1 sample1.txt sample2.txt   
01 aaaa AAAA  
02 bbbb BBBB  

paste

paste は 2 つのファイルを読み込んで、-d で指定するデリミタで行を連結する。

$ paste -d : sample1.txt sample2.txt   
01 aaaa:01 AAAA  
02 bbbb:02 BBBB  
04 cccc:05 CCCC  

tr

tr は以下の書式で読み込まれた文字列を変換したり削除したりする。

[書式] tr [option] [string1] [string2]

$ cat alb_access_log.log | tr 'a-z' 'A-Z' | cut -d " " -f 1,3 | head -10  
HTTPS APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTP APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTP APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTPS APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTP APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTPS APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTPS APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTP APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTP APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
HTTP APP/LOGCHANCE-FRONTEND/5B4D7E7B8487EAD6  
$ tr -d a-zA-Z < alb_access_log.log | head -5  
 2018-05-1403:52:13.111733 /-/547784876 223.71.238.24:62539 - -1 -1 -1 400 - 0 288 "- ://--1423232053.--1...:443- -" "-" - - - "-" "-" "-" - 2018-05-1403:52:13.019000 "-"  
 2018-05-1403:52:14.205764 /-/547784876 126.199.87.122:26609 10.1.11.207:32786 0.001 0.001 0.000 200 200 384 6964 " ://.-.:80/ /1.1" "/5.0 (;    11_1_2   ) /604.3.5 (, ) /11.0 /15202 /604.1" - - :::--1:967951649083:/-/775436751 "=1-5907-712024646539227" "-" "-" 0 2018-05-1403:52:14.204000 ""  
 2018-05-1403:52:15.483412 /-/547784876 126.199.87.122:26609 10.1.11.207:32785 0.000 0.001 0.000 200 200 384 6964 " ://.-.:80/ /1.1" "/5.0 (;    11_1_2   ) /604.3.5 (, ) /11.0 /15202 /604.1" - - :::--1:967951649083:/-/775436751 "=1-5907-27154897854520871105" "-" "-" 0 2018-05-1403:52:15.482000 ""  
 2018-05-1403:52:15.686589 /-/547784876 223.71.238.24:62542 - -1 -1 -1 400 - 0 288 "- ://--1423232053.--1...:443- -" "-" - - - "-" "-" "-" - 2018-05-1403:52:15.580000 "-"  
 2018-05-1403:52:16.755637 /-/547784876 126.199.87.122:26609 10.1.11.207:32783 0.001 0.001 0.000 200 200 384 6964 " ://.-.:80/ /1.1" "/5.0 (;    11_1_2   ) /604.3.5 (, ) /11.0 /15202 /604.1" - - :::--1:967951649083:/-/775436751 "=1-59070-3693945655441651890" "-" "-" 0 2018-05-1403:52:16.754000 ""  

sort

sort は行単位でファイルの内容をソートする。

$ cut -d " " -f 2 < alb_access_log.log | sort -r | head -10  
2018-05-14T03:55:00.578466Z  
2018-05-14T03:55:00.544947Z  
2018-05-14T03:55:00.338688Z  
2018-05-14T03:54:58.638277Z  
2018-05-14T03:54:56.548582Z  
2018-05-14T03:54:56.185081Z  
2018-05-14T03:54:55.326817Z  
2018-05-14T03:54:55.293111Z  
2018-05-14T03:54:55.092822Z  
2018-05-14T03:54:53.376894Z  

split

split は指定されたサイズでファイルを分割する。デフォルトは 1000 行ごとに複数ファイルに分割する。

$ split -20 alb_access_log.log alb_access_log.  
$ ls alb_access_log.*  
alb_access_log.aa  alb_access_log.ac  alb_access_log.ae  alb_access_log.ag  alb_access_log.ai  alb_access_log.ak  alb_access_log.log  
alb_access_log.ab  alb_access_log.ad  alb_access_log.af  alb_access_log.ah  alb_access_log.aj  alb_access_log.al  

uniq

入力されたテキストストリームの中で重複している行を調べて、重複している行は 1 つにまとめて出力する。
入力するストリームはソートされている必要があるので、sort と組み合わせて使用する。

$ cut -d " " -f 4 < alb_access_log.log | cut -d : -f 1 | sort | uniq -cu  
      1 106.121.64.155  
      1 110.7.52.244  
      1 111.204.165.186  
      1 112.224.21.133  
      1 115.236.239.29  
      1 121.69.34.146  
      1 123.157.129.58  
      1 14.28.15.46  
      1 180.155.0.78  
      1 183.6.115.44  
      1 39.155.209.219  
      1 59.42.73.191  
      1 61.148.243.136  
$ cut -d " " -f 4 < alb_access_log.log | cut -d : -f 1 | sort | uniq -cd  
      2 106.114.77.173  
     30 125.92.89.186  
     27 126.199.87.122  
     33 218.244.55.118  
    134 223.71.238.24  

pr

pr はファイルの書式を整える。ファイル名に - を指定すると標準入力から読み込む。

$ cut -d " " -f 2,4-5 alb_access_log.log | pr -l 30 +1:1 -   
  
  
2018-05-14 13:34                                                  Page 1  
  
  
2018-05-14T03:52:13.111733Z 223.71.238.24:62539 -  
2018-05-14T03:52:14.205764Z 126.199.87.122:26609 10.1.11.207:32786  
2018-05-14T03:52:15.483412Z 126.199.87.122:26609 10.1.11.207:32785  
2018-05-14T03:52:15.686589Z 223.71.238.24:62542 -  
2018-05-14T03:52:16.755637Z 126.199.87.122:26609 10.1.11.207:32783  
2018-05-14T03:52:17.298601Z 223.71.238.24:62543 -  
2018-05-14T03:52:17.620916Z 125.92.89.186:13581 -  
2018-05-14T03:52:17.898212Z 126.199.87.122:26609 10.1.11.207:32786  
2018-05-14T03:52:19.058210Z 126.199.87.122:26609 10.1.11.207:32785  
2018-05-14T03:52:19.777192Z 126.199.87.122:26609 10.1.11.207:32783  
2018-05-14T03:52:20.946209Z 223.71.238.24:62548 -  
2018-05-14T03:52:21.028178Z 126.199.87.122:26609 10.1.11.207:32786  
2018-05-14T03:52:21.858266Z 126.199.87.122:26609 10.1.11.207:32785  
2018-05-14T03:52:22.187259Z 126.199.87.122:26609 10.1.11.207:32783  
2018-05-14T03:52:22.558308Z 126.199.87.122:26609 10.1.11.207:32786  
2018-05-14T03:52:22.738493Z 223.71.238.24:62550 -  
2018-05-14T03:52:22.937485Z 126.199.87.122:26609 10.1.11.207:32785  
2018-05-14T03:52:23.190113Z 125.92.89.186:13609 -  
2018-05-14T03:52:23.218040Z 183.6.115.44:49213 -  
2018-05-14T03:52:23.287307Z 126.199.87.122:26609 10.1.11.207:32783  

fmt

fmt はテキストを決められた桁に整形する。

$ cut -d " " -f 2,4-5 alb_access_log.log | pr -l 30 +1:1 - | fmt -w 15 | head -10  
  
  
2018-05-14  
13:36  
Page 1  
  
  
2018-05-14T03:52:13.111733Z  
223.71.238.24:62539  
-  

expand/unexpand

expand: テキストファイル内のタブをスペースに変換
unexpand: テキストファイル内の連続したスペースをタブに変換

wc

ファイルの行数、単語数、文字数をカウント。

$ cut -d " " -f 4 < alb_access_log.log | cut -d : -f 1 | grep 218.244.55.118 | wc -l  
33  
$ wc -w alb_access_log.log   
6407 alb_access_log.log  

xargs

標準入力から受け取った文字列を引数に指定して、与えられたコマンドを実行する。
以下は 60 日以上更新されていないファイルを削除する例。

$ find . -mtime +60 -type f | xargs rm  

 © 2023, Dealing with Ambiguity