2012-07-29 12 views
8

既存のApacheログファイルを月ごとに別々のファイルに分割するにはどうすればよいですか?月ごとに既存のApacheログファイルを分割する方法は?

私はウェブを精査して何も見つかりませんでした。はい、私はlogrotateとcronologとそのすべてについて知っています。しかし、私が見つけたものは、既存のファイルを分割するのに役立ちません。

awkスクリプトなどはありますか?ここで

は、データの抜粋です:awkを使用して

一つの方法:

awk 'BEGIN { 
    split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec ", months, " ") 
    for (a = 1; a <= 12; a++) 
     m[months[a]] = a 
} 
{ 
    year = array[3] 
    month = sprintf("%02d", m[array[2]]) 

    split($4,array,"[:/]"); 
    print > FILENAME"-"year"_"month".txt" 
}' incendiary.ws-2009 

この意志ここ

124.115.5.11 - - [30/May/2011:23:21:37 -0500] "GET/HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)" 
58.61.164.39 - - [31/May/2011:00:36:35 -0500] "GET/HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)" 
114.80.93.55 - - [31/May/2011:01:42:17 -0500] "GET/HTTP/1.0" 200 206492 "-" "Sosospider+(+http://help.soso.com/webspider.htm)" 
114.80.93.73 - - [31/May/2011:02:03:44 -0500] "GET/HTTP/1.0" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322;TencentTraveler)" 
123.125.71.98 - - [31/May/2011:12:33:30 -0500] "GET/HTTP/1.1" 103 24576 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)" 
220.181.108.187 - - [31/May/2011:12:33:55 -0500] "GET/HTTP/1.1" 103 24576 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)" 
123.125.71.117 - - [31/May/2011:13:27:56 -0500] "GET/HTTP/1.1" 103 24576 "-" "Baiduspider+(+http://www.baidu.com/search/spider.htm)" 
123.125.71.78 - - [31/May/2011:16:45:48 -0500] "GET /node/54 HTTP/1.1" 200 3219 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 
124.115.1.8 - - [31/May/2011:19:59:58 -0500] "GET/HTTP/1.1" 200 206492 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)" 
123.125.71.69 - - [31/May/2011:22:05:46 -0500] "GET/HTTP/1.1" 200 206492 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)" 

が大幅に下のスティーブの答えに触発され、私の解決策です出力ファイル:

150メガバイトに対する
incendiary.ws-2010-2010_04.txt 
incendiary.ws-2010-2010_05.txt 
incendiary.ws-2010-2010_06.txt 
incendiary.ws-2010-2010_07.txt 

この方法は、5秒を取っている間ログファイル、chepnerで受け入れの回答は、3.4 GHzの8コアのXeon E31270上70秒を取りました。

オリジナルのインスピレーション:awkを使用してhttps://stackoverflow.com/a/11714105/430062

+1

人物:よう

awk '{ split($4,array,"[:/]"); print > array[2] array[3] ".txt" }' file.txt 

この意志の出力ファイルあなたが作業しているものを表示するために入力/出力のペアを提供することができれば、それは良いでしょう/可能であれば出て行きたい – Levon

+0

あなたの優れた提案を実装しました。 –

答えて

12

一つの方法:

awk '{ split($4,array,"/"); print > array[2] ".txt" }' file.txt 

のようなこの意志の出力ファイル:

May.txt 
June.txt 
July.txt 
etc 

EDIT:

はおそらく別の年を維持したいと思います:必ずしも知っているか、あなたがしようとしているデータファイルへのアクセスを持っていない可能性があります:)のawk(または何かを知っている

May2011.txt 
May2012.txt 
July2011.txt 
etc 
+1

アルゴリズムを変更して、FILENAME-YYYY_MMという形式にしました。私はそれを私の質問に貼り付けました。 –

関連する問題