瞬間アクセス数ランキングを出すコマンド
# 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行の、4番目の部分を取り出します。「$4」が4番目の指定に当たります。
- 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 …略…
おわりに
どんなに素晴らしい解析ツールがあっても cat access_log | awk '{ print $4 }' | sort | uniq -c | sort -r | less は鉄板でおすすめです
— 💙Kazuhiro OSAWA (@Yappo) December 17, 2013
こちらが本投稿のきっかけでございます。大変勉強になりました。ありがとう存じます。
パッと見て、怪しい破壊的なコマンドでないことはわかりましたし、よさそうな香りもいたしました。
けれども、なにが起きるのか、わかりませんでした。なにが起きるのかしら!
そのような好奇心を持って、今回このコマンドを打ってみましたの♪
以上です。