ot2sy39's note

twitter 140文字じゃ書けないときの外部エントリみたいな

【復習】第16回春だからログ解析するぞシェル芸勉強会:02

【復習】第16回春だからログ解析するぞシェル芸勉強会:01 - ot2sy39's diary の続き。

Q1 NASAのログについて、ステータスコードを抽出して、どのコードがいくつあるか数えてみましょう

初手思いついたのがコレ。あるパターンの行の数を数えるとき、ついパターンをキーとした連想配列に出現回数を数えてしまう。

gawk '{status[$(NF-1)]+=1} END{for(i in status){printf i, status[i]}}' access_log

でもサンプル回答ではキーをプリントしちゃって、sort & uniq -c。

awk '{print $(NF-1)}' access_log | LANG=C sort | uniq -c

うむ、サンプルの方が間違いなくシンプル。

念のため手元の環境*1で処理時間を測ってみると、 だいたい連想配列版が半分くらいの時間で完了していた(やったね!)*2。 富豪なら無視するレベルだが。

連想配列 sort | uniq -c版
real 4.243s 9.335s
user 3.955s 10.130s
sys 0.286s 0.554s

Q2 NASAのログについて、ファイルを開かずに、ログの多い日を探しだしてみましょう

「ログの多い日」=「ファイルの行数の多い日」としか考えられず、 頭の中は以下のコマンドで占拠されてしまった。

wc -l 1995*

サンプル回答は「ls -l | sort -k5,5n | tail」。 「lsを使ってサイズを見たら開かないでも見当がつきます」とのこと。 まあそうだよね。

*1:さくらVPS(1G) 石狩第1ゾーン メモリ1GB ディスク100GB(HDD) CPU2コア CentOS 6.3(64bit) ローカルにまともなUNIX環境がないのでVPSでやってる……

*2:サンプル回答はawkだがCentOSなのでawk=gawk