Apache の生ログをワンライナーで解析するパターン集。
例えば以下のようなリクエスト別のアクセス数など。
$ grep 01/Feb/2016:01 access_log | awk -F '"' '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -n -r
69 /
48 /en/
35 /css/base.css
23 /favicon.ico
23 /img/example.jpg
とりあえずコピペ用
時間単位別リクエスト数(日別、時間別、分別、秒別)
grep 'May/2016' /var/log/httpd/access_log | awk '{print $4}' | cut -b 2-12 | sort | uniq -c # 日別
grep '01/May/2016' /var/log/httpd/access_log | awk '{print $4}' | cut -b 2-15 | sort | uniq -c # 時間別
grep '01/May/2016:01' /var/log/httpd/access_log | awk '{print $4}' | cut -b 2-18 | sort | uniq -c # 分別
grep '01/May/2016:01:00' /var/log/httpd/access_log | awk '{print $4}' | cut -b 2-21 | sort | uniq -c # 秒別
項目別リクエスト数(リクエスト別、UA別、ブラウザ別、リファラー別、IP別)
grep '01/May/2016:01' /var/log/httpd/access_log | awk -F \" '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -nr # リクエスト別
grep '01/May/2016:01' /var/log/httpd/access_log | awk -F \" '{print $6}' | sort | uniq -c | sort -nr | head -n 5 # UserAgent別
for UA in MSIE Firefox Chrome Safari; do COUNT=`grep '01/May/2016:01' /var/log/httpd/access_log | grep "$UA" | wc -l`; echo "$UA: $COUNT"; done
grep '01/May/2016:01' /var/log/httpd/access_log | awk -F \" '{print $4}' | sort | uniq -c | sort -nr # リファラー別
grep '01/May/2016:01' /var/log/httpd/access_log | cut -d " " -f 1 | sort | uniq -c # IP別
| grep -ive "GET /.*\.\(css\|js\|jpg\|gif\|png\|swf\|ico\)\ HTTP"
grep '01/May/2016:01' /var/log/httpd/access_log | grep -c 'favicon.ico'
時間単位別リクエスト数
時間単位別リクエスト数を集計するために、まず grep
コマンドで日時などのテキストで全体の行を絞り込んで取得、 awk
コマンドで4番目の日時データを切り出し、さらに特定の時間単位で集計するために cut
コマンドで範囲を指定して切り出し、sort
コマンドで時間順に並び替えてから、最後に uniq
コマンドで集計して終わり。
日別リクエスト数
grep 'Feb/2016' access_log | awk '{print $4}' | cut -b 2-12 | sort | uniq -c
5960 01/Feb/2016
7493 02/Feb/2016
7023 03/Feb/2016
7292 04/Feb/2016
7144 05/Feb/2016
grep で年月 (ex.Feb/2016
) を、cut に 2-12
を指定してやると日別のアクセス数が出力できる。
時間別リクエスト数
grep 01/Feb/2016 access_log | awk '{print $4}' | cut -b 2-15 | sort | uniq -c
149 01/Feb/2016:00
384 01/Feb/2016:01
465 01/Feb/2016:02
328 01/Feb/2016:03
272 01/Feb/2016:04
grep で年月日 (ex.01/Feb/2016
) を、cut に 2-15
を指定してやると時間別のアクセス数が出力できる。
分別リクエスト数
grep 01/Feb/2016:01 access_log | awk '{print $4}' | cut -b 2-18 | sort | uniq -c
7 01/Feb/2016:01:00
13 01/Feb/2016:01:01
6 01/Feb/2016:01:02
6 01/Feb/2016:01:03
2 01/Feb/2016:01:04
grep で年月日と時 (ex.01/Feb/2016:01
) を、cut に 2-18
を指定してやると分別のアクセス数が出力できる。
秒別リクエスト数
grep 01/Feb/2016:01:00 access_log | awk '{print $4}' | cut -b 2-21 | sort | uniq -c
1 01/Feb/2016:01:00:00
2 01/Feb/2016:01:00:10
1 01/Feb/2016:01:00:12
1 01/Feb/2016:01:00:23
2 01/Feb/2016:01:00:25
grep で年月日と時分 (ex.01/Feb/2016:01:00
) を、cut に 2-21
を指定してやると秒別のアクセス数が出力できる。
項目別リクエスト数
リクエスト別アクセス数
grep 01/Feb/2016:01 access_log | awk -F '"' '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -n -r | head -n 5
69 /
48 /en/
35 /css/base.css
23 /favicon.ico
23 /img/example.jpg
grep に絞り込みたい値を渡してやると、リクエスト別のアクセス数が出力できる。
上記の例では年月日と時 (01/Feb/2016:01
) を渡しているので、2016年2月1日1〜2時のリクエスト別アクセス数ということになる。
ユーザーエージェント別リクエスト数
grep 01/Feb/2016:01 access_log | awk -F '"' '{print $6}' | sort | uniq -c | sort -n -r | head -n 5
20 Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1
19 Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; GT-N7100 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
18 Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
17 Mozilla/5.0 (Windows NT 6.1; rv:43.0) Gecko/20100101 Firefox/43.0
17 Mozilla/5.0 (Linux; Android 5.0; Lenovo A7000-a Build/LRX21M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.95 Mobile Safari/537.36
ブラウザ別リクエスト数
for UA in MSIE Firefox Chrome Safari; do COUNT=`grep '01/Feb/2016:01' /var/log/httpd/access_log | grep "$UA" | wc -l`; echo "$UA: $COUNT"; done
MSIE: 33
Firefox: 398
Chrome: 1163
Safari: 1996
その他
圧縮されたログファイルのアクセス数
ls /var/log/httpd/
access_log access_log.4.gz error_log error_log.4.gz
access_log.1 access_log.5.gz error_log.1 error_log.5.gz
access_log.2.gz access_log.6.gz error_log.2.gz error_log.6.gz
access_log.3.gz access_log.7.gz error_log.3.gz error_log.7.gz
zgrep 01/Feb/2016 /var/log/httpd/access_log* | awk -F '"' '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -n -r
69 /
48 /en/
35 /css/base.css
23 /favicon.ico
23 /img/example.jpg