シェル操作課題 (cut, sort, uniq などで集計を行う) 設問編

この記事は弊チームの新人の方にシェル操作に慣れてもらうために作った課題である。
皆様のチームの新人にやってもらってもいいですね。
あとで解答編を書く。

もちろん他の方も解いてもらって構わない。
というか僕の解答以上の解答がきっとあるはずなので、それを教えて欲しい。

はてブで解答でも面白解答お待ちしてます。


さて本題。
Webアプリケーションを作っていると偉いさんとか、いわゆる企画の人とかから
「ちょっと○○がどうなってるかログから数字だせない?」
とさらっとお願いされたりする。

そこで「いや、ちょっと手が空いてなくて(こっちは忙しいんだよ糞がっ)」と答えたくなるかもしれないが、
そこは「じゃあさくっとやっておきますよ!僕にかかればちょろいっすよ!」と答えらればかっこいい。
(あまりさくっとやりすぎるとそういう細々依頼がたくさんくる諸刃の剣)


例えば以下のようなログファイルがあったとする。
ファイルの形式は、カンマ区切りで「サーバー名,unixtime,ユーザーID,アクセス先」。

server1,1343363124,30,/video.php
server2,1343363110,20,/profile.php
server3,1343363115,7,/login.php
server1,1343363105,8,/profile.php
server2,1343363205,35,/profile.php
server2,1343363110,20,/profile.php
server3,1343363205,30,/login.php
server4,1343363225,12,/video.php
server1,1343363265,7,/video.php

追記:ブログ書きながら色々元ファイル修正してたらミスってました。想定解答が違ったりして皆様に迷惑かけました。ごめんなさい。

以下に、このファイルを元にやってほしい作業を書くのでターミナルで作業して想定期待結果を表示して欲しい。
ヒントが書いてあるが、ヒント通りにやらなくてもいい。
もちろんヒントはググっていいし、>man cat とかでマニュアルも見よう。
いっそpythonワンライナーで実行したらカッコイイと思うw

え。Windows?まさか???cygwin入れたり、vmでやってみたり、開発サーバーで作業すればいいんじゃないっすか(ホジホジ)


ヒント:cat,パイプ,sort,cut,uniq,wc,sed,perl,awk,grep,head,tail,date,and so on

問1 このファイルを表示しろ

想定期待結果はファイル全体の表示

問2 このファイルからサーバー名とアクセス先だけ表示しろ

想定期待結果:

server1,/video.php 
server2,/profile.php
server2,/login.php  
server1,/profile.php 
server2,/profile.php 
server2,/profile.php
server3,/login.php 
server4,/video.php 
server1,/video.php 

問3 このファイルからserver4の行だけ表示しろ

想定期待結果:

server4,1343363225,12,/video.php 

問4 このファイルの行数を表示しろ

想定期待結果: 9

問5 このファイルをサーバー名、ユーザーIDの昇順で5行だけ表示しろ

想定期待結果:

server1,1343363265,7,/video.php 
server1,1343363105,8,/profile.php 
server1,1343363124,30,/video.php 
server2,1343363115,7,/login.php  
server2,1343363110,20,/profile.php

問6 このファイルには重複行がある。重複行はまとめて数え行数を表示しろ

想定期待結果: 8
補足:

hoge,30
foo,20
hoge,30 

だったら2行と数える。

問7 このログのUU(ユニークユーザー)数を表示しろ

想定期待結果: 6

問8 このログのアクセス先ごとにアクセス数を数え上位1つを表示しろ

想定期待結果:3 /video.php

追記:Twitterで指摘されましたが間違ってました…これも元データブログ書いてる最中にいじったせいです。すいません><
想定期待結果: 4 /profile.php

問9 このログのserverという文字列をxxxという文字列に変え、サーバー毎のアクセス数を表示しろ

想定期待結果:

    3 xxx1
   3 xxx2
   2 xxx3
   1 xxx4

追記:上記想定結果も最初書いたのと変えました。元データが(ry すいませんでした><

問10 このログのユーザーIDが10以上の人のユニークなユーザーIDをユーザーIDでソートして表示しろ

想定期待結果:

12
20
30
35

ログが数十Gだったら?

Hadoop使っとけ

あるいはExcelは大171億7986万9184件のデータが使えるのでExcel使えばいいのでは
http://itpro.nikkeibp.co.jp/article/NEWS/20120725/411322/