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 *
Author And Source
この問題について(AWKでグラフ的な表示), 我々は、より多くの情報をここで見つけました https://qiita.com/ma2saka/items/71f050ef8b7719a3bdf6著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .