awk

とあるawkのログ集計法

estis2011/05/02 (月) 22:50 に投稿

今日似たようなことを質問されたので、忘れないようにメモ。


次のようなフォーマットのApacheアクセスログがある。

66.249.69.115 - - [19/Feb/2011:00:00:22 +0900] "GET /dp/user/login?destination=forum%2F60%3Fpage%3D1 HTTP/1.1" 200 63005 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.69.115 - - [19/Feb/2011:00:00:24 +0900] "GET /dp/aggregator/archives/www.cbsnews.com/2009/01/2009/08/30/free-the-h-1bs-free-the-economy?page… HTTP/1.1" 200 112495 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

ここでは、対象ファイルには、事前の操作でその日1日(0:00:00~23:59:59)のログがまとめられているとする。
ここからアクセス元IP毎に、何時何分にアクセスがあったかを集計する。

# awk -F[/:" "] '{IP[$7":"$8]=$1}END{for(i in IP)print IP[i],i}' LOG | sort | awk '{T[$1]=T[$1]" "$2}END{for(i in T)print i" ----"T[i]}' | sort -t. -k1 -n

awkの配列へのアクセス

estis2009/12/23 (水) 15:19 に投稿

awkの配列を使う場合よくやるのは、

awk '/2009:22/{FROM[$1]++}END{for(i in FROM)print i"\t"FROM[i]}' /var/log/httpd/access_log | sort -k2 -nr | head -10

とかですが、
配列のキーになるものがわかっている場合は、

ARRAY[KEY]

でアクセスできるわけですが、KEYが文字列だと、awkは変数扱いするので意図通りになりません。
なので、

ARRAY["KEY"]

と、ダブル・クォーテーション「"」で括る必要があります。

同名ファイルでサイズ違いのものだけを表示

estis2009/04/07 (火) 18:06 に投稿

やりたいこと:

次のような二つのディレクトリがあり、同じ名前のファイルがそれぞれあるが、その内サイズが異なるファイル名を表示する。
これをワンライナーで実現する。

$ ls -l *

TEST_1:
total 32
-rw-r--r--  1 estis  estis    4  4  7 09:44 test01
-rw-r--r--  1 estis  estis   44  4  7 09:49 test02
-rw-r--r--  1 estis  estis  118  4  7 09:46 test03
-rw-r--r--  1 estis  estis   40  4  7 09:47 test04

TEST_2:
total 32
-rw-r--r--  1 estis  estis    4  4  7 09:44 test01
-rw-r--r--  1 estis  estis    4  4  7 09:45 test02
-rw-r--r--  1 estis  estis  118  4  7 09:46 test03
-rw-r--r--  1 estis  estis   80  4  7 09:48 test04

こういう状態なので、欲しい答えは、
test02とtest04。