LoginSignup
303
295

More than 5 years have passed since last update.

Apache ログを awk と uniq だけで集計する

Last updated at Posted at 2016-05-23

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

Apache 関連記事

303
295
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
303
295