はじめに
アクセスログ解析に役立ちそうなコマンドの使用方法についてまとめる。(一部違うけど)
例として取り上げるアクセスログは 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