アクセス解析で便利だったコマンド集
アクセス解析でこのアクセスだけのログを見たいや、
データ数を知りたいなどをLinuxのコマンドラインでやったのですが、
その時に便利だったコマンドをメモです。
サンプル
log.txtというサンプルで作ったアクセスログで試します。
Apacheのアクセスログのフォーマットで作りました。
[size]や[Referer]や[User-Agent]は割愛してます。
$ cat log.txt 127.0.0.1 - - [01/Jan/2010:22:01:04 +0900] "GET /index.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [02/Jan/2010:10:36:51 +0900] "GET /download/1.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [10/Jan/2010:12:53:11 +0900] "GET /download/2.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [20/Jan/2010:07:12:32 +0900] "GET /index.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [24/Jan/2010:17:45:18 +0900] "GET /help.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [25/Jan/2010:18:16:27 +0900] "GET /download/1.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [05/Feb/2010:15:59:27 +0900] "GET /download/2.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [27/Feb/2010:18:15:03 +0900] "GET /index.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [27/May/2010:02:57:26 +0900] "GET /download/3.html HTTP/1.0" 200 [size] [Referer] [User-Agent]
cut
cutコマンドは、文の一部を取り出すコマンド。
取り出す基準をどういう単位にするかはオプションで指定できます。
- -f:フィールド(デフォルトはタブ)
- -b:バイト
- -c:文字
ここではよく使う-fを用います。
// -dでフィールドの区切り文字を空白にしてIP部分だけ取得 $ cut -d " " -f1 log.txt 127.0.0.1 127.0.0.1 127.0.0.1 ・・・ // 日付を取得したいけど-f4だと全て取得できない $ cut -d " " -f4 log.txt [01/Jan/2010:22:01:04 [02/Jan/2010:10:36:51 [10/Jan/2010:12:53:11 ・・・ // -f4-5としてフィールドを連続で取得 $ cut -d " " -f4-5 log.txt [01/Jan/2010:22:01:04 +0900] [02/Jan/2010:10:36:51 +0900] [10/Jan/2010:12:53:11 +0900] ・・・
sort
ソートして標準出力します。
- kでソートするフィールドを指定します。
デフォルトのフィールド区切り文字は空白。-tで区切り文字も指定できます。
// URLでソート $ sort -k6 log.txt 127.0.0.1 - - [02/Jan/2010:10:36:51 +0900] "GET /download/1.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [25/Jan/2010:18:16:27 +0900] "GET /download/1.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [05/Feb/2010:15:59:27 +0900] "GET /download/2.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [10/Jan/2010:12:53:11 +0900] "GET /download/2.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [27/May/2010:02:57:26 +0900] "GET /download/3.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [24/Jan/2010:17:45:18 +0900] "GET /help.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [01/Jan/2010:22:01:04 +0900] "GET /index.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [20/Jan/2010:07:12:32 +0900] "GET /index.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [27/Feb/2010:18:15:03 +0900] "GET /index.html HTTP/1.0" 200 [size] [Referer] [User-Agent]
unid
同じ値を一つにまとめて出力します。
- cをつければカウント数も表示します。
// URLを取得してソートしてURLごとにまとめる $ cut -d " " -f7 log.txt | sort | uniq /download/1.html /download/2.html /download/3.html /help.html /index.html // アクセス数も表示 $ cut -d " " -f7 log.txt | sort | uniq -c 2 /download/1.html 2 /download/2.html 1 /download/3.html 1 /help.html 3 /index.html
指定した検索パターンにマッチしたものを表示します。
// /downloadだけ表示する。 $ grep /download/[1-3].html log.txt 127.0.0.1 - - [02/Jan/2010:10:36:51 +0900] "GET /download/1.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [10/Jan/2010:12:53:11 +0900] "GET /download/2.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [25/Jan/2010:18:16:27 +0900] "GET /download/1.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [05/Feb/2010:15:59:27 +0900] "GET /download/2.html HTTP/1.0" 200 [size] [Referer] [User-Agent] 127.0.0.1 - - [27/May/2010:02:57:26 +0900] "GET /download/3.html HTTP/1.0" 200 [size] [Referer] [User-Agent] // 各download数を表示する。 $ grep /download/[1-3].html log.txt | cut -d " " -f7 | sort | uniq -c 2 /download/1.html 2 /download/2.html 1 /download/3.html
以上のコマンドをパイプとか上手く使えば役立つはず。