初めてのシステムと日記

システムも日記も初めてです。

アクセス解析で便利だったコマンド集

アクセス解析でこのアクセスだけのログを見たいや、

データ数を知りたいなどを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


grep

指定した検索パターンにマッチしたものを表示します。

// /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


以上のコマンドをパイプとか上手く使えば役立つはず。