AWKでグラフ的な表示


ごく個人的なスニペットです。昔のブログからサルベージ。

たまにターミナル上でばーっとログを比較したい時があって、使います。

ワンライナー版
awk 'match($0, /^[^ ]+ /) { lst[substr($0 ,RSTART,RLENGTH)] += 1} END { for(a in lst){ l =""; for(i=0;i<lst[a]/1000;i++){ l = l"*"; }  printf("%10d  %-30s %s\n" , lst[a],a,l);} }' | sort  -n
改行とコメントを入れたもの
awk '
/* 正規表現にマッチしたワードをカウントする */
match($0, /^[^ ]+ /) { 
    lst[substr($0 ,RSTART,RLENGTH)] += 1;
}

/* カウントしたワードとカウントを * の数で表す */
END { 
    for(a in lst){ 
        l =""; 
        for(i=0;i<lst[a]/1000;i++) l = l"*"; 
        printf("%10d  %-30s %s\n" , lst[a],a,l);
    } 
}' 

利用イメージ

Apache のログの頭にドメイン名が出ていると仮定すると、

cat /var/log/httpd/access_log \
| awk 'match($0, /^[^ ]+ /) { lst[substr($0 ,RSTART,RLENGTH)] += 1} END { for(a in lst){ l =""; for(i=0;i<lst[a]/1000;i++){ l = l"*"; }  printf("%10d  %-30s %s\n" , lst[a],a,l);} }' \
| sort  -n

結果

      1594  example.com                    **
      1994  foo.example.jp                 **
      2179  moe.example.jp                 ***
      4875  127.0.0.1                      *****
     10648  example.jp                     ***********

まとめ

意外とテキストベース端末でも可視化は有効。

ここであげたようなサブドメインごとの件数集計以外にも1分ごとにどのくらいの接続があったのか、とか正規表現と出力をちょろっと変えることでいつものコンソール上で見やすく整形できるのでけっこう便利です。

たとえば以下のように変更することで、一分ごと(/2013:10:[0-9]+/ にマッチしたパターンごと)の集計が実現できます。

awk 'match($0, /2013:10:[0-9]+/) { lst[substr($0 ,RSTART,RLENGTH)] += 1} END { for(a in lst){ l =""; for(i=0;i<lst[a]/10;i++){ l = l"*"; }  printf("%s\t%5d\t%s\n" , a, lst[a],l);} }' | sort  -n

手持ちの検証サーバでの結果は、こんな感じになります。

2013:10:34     52   ******
2013:10:35     26   ***
2013:10:36     23   ***
2013:10:37     26   ***
2013:10:38     26   ***
2013:10:39     23   ***
2013:10:40     11   **
2013:10:41     31   ****
2013:10:42    275   ****************************
2013:10:43     17   **
2013:10:44     16   **
2013:10:45     15   **
2013:10:46     25   ***
2013:10:47     23   ***
2013:10:48     21   ***
2013:10:49     30   ***
2013:10:50     16   **
2013:10:51     37   ****
2013:10:52     17   **
2013:10:53     23   ***
2013:10:54      9   *
2013:10:55      5   *
2013:10:56      5   *