2013年3月16日土曜日

[awk]awkでちょっと便利にログ集計

最近ログばっかりみてます。エリーです。

生ログみつづけるのもきついので
awkでちまちま整形ツールつくってます。

めあたらしいこととはいえないけど、最近学習したことということで
ブログエントリー。

YYYYMMDDHHMM  TOMATO TOKYO 1

というありふれたフォーマットのログsample.logを
以下のように集計するとします。

YYYYMMDDHHMM 毎の
(1) ログの本数
(2) 第4フィールドの平均
(3) 第4フィールドが0だった場合のログの本数

いっこいっこかくと

(1) grep YYYYMMDDHHMM sample.log | awk '{ print NR } END{ print NR }'
(2) grep YYYYMMDDHHMM sample.log | awk '{ sum+= $NF } END { print sum/NR}'
(3) grep YYYYMMDDHHMM sample.log | awk '{ if ( $4==0 ) { count+=1 }} END { print  count }'
 
だいたいこんな処理になります。

解説:
$NR --- 処理対象の行番号(ENDでは最終行番号=全体の行数がはいります)
$NF --- awkが処理した行の最終フィールド値
$4 -- awk が処理した行の4番目のフィールド値(ここでは4番目が最終フィールドなので$NFと同じ値になります)
{ if ( $3 = 0 ) { count +=1 }} END { print  count }'
awkはスクリプト言語なのでif文がつかえます。
ここでは $4フィールドが0であれば変数countをインクリメントしています。

これを
YYYYMMDDHHMM  (1) (2) (3)
の形で吐き出すようにシェルスクリプトに書き直します。

#!/bin/bash

export LOG="sample.log"

echo -- TIME -- linecount -- total -- average -- zerototal

for time in `cat $LOG | awk '{print $1}' | sort | uniq `
do
    grep $time $LOG | awk '
         BEGIN{ zerocount=0; sum=0 }
                     { sum+=$NF }
                     { if( 0==$NF) { zerocount+=1 } }
         #END{ print $1, $NR, sum/NR, zerocount }
         END{ print $1, NR, sum, sum/NR ,zerocount }
         '
done


解説:
ログ中には同じYYYYMMDDHHMMの行は複数あるので、
重複を無くしてforの引数として渡します。

取り出した$timeでログをgrepします。
ここで絞り込んだログがawkの処理対象となります。

awkはawk '{}'の中に複数の処理を書く事ができます。
BEGIN{ zerocount=0; sum=0 }
最初に行われる処理です。
ここでは0の場合は0を出力したいため、変数を0で初期化しています。

次の{からENDまでの間が集計処理です。
awkは渡されたデータを一行ずつ処理します。

{ sum+=$NF }
変数sumに最終フィールド$NFを合計していっています。

{ if( 0==$NF) { zerocount+=1 } }
最終フィールド$NFが0だった場合、変数zerocountをインクリメントしています。

END
最後に行う処理です。。
$1, $NR, sum/NR, zerocount
で第一フィールド(YYYYMMDDHHMM)、行数、第4フィールド平均(合計値/行数)、第4フィールドの0の合計数
を出力しています。

出力結果はこんなかんじ。
目視で見たい場合はタイトル行をechoすると見やすいです。
-- TIME -- linecount -- total -- average -- zerototal
201303160001 2 0 0 2
201303160002 1 3 3 0
201303160003 1 1 1 0
201303160004 5 16 3.2 0
201303160005 1 1 1 0

集計対象ログ
201303160001 TOMATO TOKYO 0
201303160001 TOMATO TOKYO 0
201303160002 ICHIGO TOKYO 3
201303160003 ICHIGO TOKYO 1
201303160004 TOMATO OOSAKA 3
201303160004 TOMATO TOKYO 4
201303160004 TOMATO NAGOYA 4
201303160004 TOMATO TOKYO 1
201303160004 TOMATO FUKUOKA 4
201303160005 TOMATO FUKUOKA 1

あとは出力結果をファイルに吐き出して、さらにいじいじするなり、
ツールにとりこんでグラフにするなりあとはおすきなように♥

こういうツールがさくさくかけちゃうawk、かわいいです☆

普段の作業もう少し便利に。もっと簡単に☆
エリーでした(*^▽^*)













0 件のコメント:

コメントを投稿