カテゴリー
Linux

【Linux】瞬間アクセス数ランキング!解析コマンド「cat access_log | awk ‘{ print $4 }’ | sort | uniq -c | sort -r | less」

瞬間アクセス数ランキングを出すコマンド

# access_log を解析して瞬間アクセスランキングを出力
cat access_log | awk '{ print $4 }' | sort  | uniq -c | sort -r | less

ひとつひとつ分解して解説してみます!

多くのコマンドが組み合わさっています。左から順番に、ひとつひとつ見ていきますわ。

cat access_log

access_log を標準出力に書き出します。要するに、画面に access_log ファイルの内容を全部表示します。

|

「|」パイプ。パイプの左側のコマンドによる標準出力を、パイプの右側のコマンドに渡します。

「cat access_log | awk ‘{ print $4 }’」を例に取りますと、「cat access_log」の標準出力内容を全部、「awk ‘{ print $4 }’」コマンドに処理してもらいます。

awk '{ print $4 }'

awk はオークと発音するみたいですわ。次のことをいたします。

  1. 入力データの1行を空白区切りのデータと解釈します。
  2. データの1行の、4番目の部分を取り出します。「$4」が4番目の指定に当たります。
  3. print 、つまり標準出力します。改行ありです。

print は awk の中で使われる制御文のようですの。つまり、ここでの print は Unix のコマンドではなく、awk のコマンド、というイメージで良さそうですわね。

sort

昇順にソートします。

uniq -c

重複した行を削除します。そして行表示しますけれどもその際、重複した行の数を表示します。

なお、ファイルはソート済みであることが前提ですの。上下の行を見て、一致するなら削除する、という処理なのでしょうね。

sort -r

降順にソートします。

less

パイプから渡ってきたデータをページ単位で自由に閲覧できるようになります。閲覧中は、「/」で検索、「f」で 1 画面進む、「b」で 1 画面戻る、をよく使いますわね。

具体的に試してみますの!

http のアクセスログから適当に連続した 10 行を拾い、ファイルにしましたの。

これにコマンドを順に足して試していきますわね。

まずは cat access_log ですわ。ただ単にファイルのすべてが出力されましたね。

[root@oki2a24 tmp]# cat access_log
192.0.84.33 - - [05/Jan/2014:02:02:38 +0900] "HEAD / HTTP/1.1" 200 - "-" "jetmon/1.0 (Jetpack Site Uptime Monitor by WordPress.com)"
157.55.33.123 - - [05/Jan/2014:02:02:26 +0900] "GET /?p=4086 HTTP/1.1" 301 20 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
119.228.226.40 - - [05/Jan/2014:02:02:27 +0900] "GET /2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/ HTTP/1.1" 200 20373 "http://m.chiebukuro.yahoo.co.jp/detail/q14117916404" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-content/plugins/jetpack/modules/likes/style.css?ver=2.7 HTTP/1.1" 200 1198 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-content/plugins/picasa-express-x2/pe2-display.css?ver=2.2.10 HTTP/1.1" 200 1841 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-content/plugins/jetpack/modules/subscriptions/subscriptions.css?ver=3.8 HTTP/1.1" 200 81 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-content/plugins/jetpack/modules/widgets/widgets.css?ver=20121003 HTTP/1.1" 200 144 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-includes/js/mediaelement/mediaelementplayer.min.css?ver=2.13.0 HTTP/1.1" 200 2880 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-content/plugins/jetpack/modules/carousel/jetpack-carousel.css?ver=20120629 HTTP/1.1" 200 4565 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
119.228.226.40 - - [05/Jan/2014:02:02:44 +0900] "GET /wp-content/plugins/wp-syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0 HTTP/1.1" 200 1314 "https://oki2a24.com/2013/01/07/how-to-print-your-image-to-new-years-card-at-7-11/" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53"
[root@oki2a24 tmp]#

次に cat access_log | awk ‘{ print $4 }’ です。4 番目はアクセスを記録した時間ですわ。これだけを各行から抜き出して、出力しております。ずいぶんとすっきりいたしました。

[root@oki2a24 tmp]# cat access_log | awk '{ print $4 }' [05/Jan/2014:02:02:38
[05/Jan/2014:02:02:26
[05/Jan/2014:02:02:27
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[root@oki2a24 tmp]#

さらに、cat access_log | awk ‘{ print $4 }’ | sort でソートします。アクセスログは、時間順に記録されていると思い込んでいましたけれども、少し前後するのですね。はじめて認識いたしました。

[root@oki2a24 tmp]# cat access_log | awk '{ print $4 }' | sort
[05/Jan/2014:02:02:26
[05/Jan/2014:02:02:27
[05/Jan/2014:02:02:38
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[05/Jan/2014:02:02:44
[root@oki2a24 tmp]#

続いて cat access_log | awk ‘{ print $4 }’ | sort  | uniq -c ですわ。重複行を削除して、重複数を先頭に表示しています。これでもう、ほとんどランキング完成ですの!

[root@oki2a24 tmp]# cat access_log | awk '{ print $4 }' | sort  | uniq -c 
      1 [05/Jan/2014:02:02:26
      1 [05/Jan/2014:02:02:27
      1 [05/Jan/2014:02:02:38
      7 [05/Jan/2014:02:02:44
[root@oki2a24 tmp]#

そして cat access_log | awk ‘{ print $4 }’ | sort  | uniq -c | sort -r で降順に並べ直します。

これでアクセス数の多い順番に並びました。

[root@oki2a24 tmp]# cat access_log | awk '{ print $4 }' | sort  | uniq -c | sort -r
      7 [05/Jan/2014:02:02:44
      1 [05/Jan/2014:02:02:38
      1 [05/Jan/2014:02:02:27
      1 [05/Jan/2014:02:02:26
[root@oki2a24 tmp]#

最後に、cat access_log | awk ‘{ print $4 }’ | sort  | uniq -c | sort -r | less です。

ファイルの形式で今までの結果を開いて、縦横無尽に移動しやすくなります。

[root@oki2a24 tmp]# cat access_log | awk '{ print $4 }' | sort  | uniq -c | sort -r | less
      7 [05/Jan/2014:02:02:44
      1 [05/Jan/2014:02:02:38
      1 [05/Jan/2014:02:02:27
      1 [05/Jan/2014:02:02:26
(END)

やったね♪これで、おしまいっ!。。。なのですけれども、1点気になっております。

コマンド、sort を 1 つ減らして、もう少し省略できるのでは? → が、ダメっ!

uniq -c する前に、昇順ソートしておりますけれども、この時点で降順ソートしておけば、sort は 1 回だけで済むのではないでしょうか?

つまりこうですの。

cat access_log | awk '{ print $4 }' | sort -r | uniq -c | less

先ほどの抜き出したファイルに対して行ってみましたわ。

      7 [05/Jan/2014:02:02:44
      1 [05/Jan/2014:02:02:38
      1 [05/Jan/2014:02:02:27
      1 [05/Jan/2014:02:02:26
(END)

結果は一致、、、いたしますね。コマンドの内容としても、これでよいように思います。

けれども、行数が少ないからこれで問題ないように見えるだけで、実はダメなのかもしれません。

もっと大きなファイルで試してみました!結果、ダメでした!次のような形となり、まったくもってランキングの体を無しておりませんわ!

…略…
      1 [09/Jan/2014:22:08:35
      1 [09/Jan/2014:22:08:08
      1 [09/Jan/2014:22:08:07
      6 [09/Jan/2014:22:08:02
     13 [09/Jan/2014:22:08:01
     23 [09/Jan/2014:22:08:00
      1 [09/Jan/2014:22:07:58
      1 [09/Jan/2014:22:07:56
      7 [09/Jan/2014:22:07:54
     26 [09/Jan/2014:22:07:53
…略…

おわりに

こちらが本投稿のきっかけでございます。大変勉強になりました。ありがとう存じます。

パッと見て、怪しい破壊的なコマンドでないことはわかりましたし、よさそうな香りもいたしました。

けれども、なにが起きるのか、わかりませんでした。なにが起きるのかしら!

そのような好奇心を持って、今回このコマンドを打ってみましたの♪

以上です。

コメントを残す