2012-07-29 24 views
8

Làm cách nào để phân tách tệp nhật ký apache hiện có thành các tệp riêng biệt theo tháng?Cách tách nhật ký apache hiện tại theo tháng?

Tôi đã xóa web và tôi không thể tìm thấy bất kỳ thứ gì. Vâng, tôi biết về logrotate và cronolog và tất cả những điều đó. Nhưng không có gì tôi tìm thấy sẽ giúp tôi chia nhỏ các tệp hiện có.

Có kịch bản awk hay gì đó không?

Dưới đây là một đoạn dữ liệu:

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)" 

Đây là giải pháp của tôi, lấy cảm hứng từ rất nhiều bởi câu trả lời của Steve dưới đây:

Một cách sử dụng 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 

chí này các tệp đầu ra như:

incendiary.ws-2010-2010_04.txt 
incendiary.ws-2010-2010_05.txt 
incendiary.ws-2010-2010_06.txt 
incendiary.ws-2010-2010_07.txt 

Against một log file 150 MB, trả lời được chấp nhận bởi chepner mất 70 giây trên 3,4 GHz 8 Core Xeon E31270, trong khi phương pháp này mất 5 giây.

gốc cảm hứng: https://stackoverflow.com/a/11714105/430062

+1

Những người biết awk (hoặc một cái gì đó :) có thể không nhất thiết phải biết hoặc có thể truy cập các tập tin dữ liệu bạn đang cố gắng để thao tác, sẽ tốt nếu bạn có thể cung cấp một số cặp đầu vào/đầu ra để hiển thị những gì bạn đang làm việc/muốn thoát ra nếu có thể – Levon

+0

Tôi đã thực hiện đề xuất tuyệt vời của bạn. –

Trả lời

12

Một cách sử dụng awk:

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

chí này tập tin đầu ra như:

May.txt 
June.txt 
July.txt 
etc 

EDIT:

Có lẽ bạn muốn giữ những năm riêng biệt:

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

chí này tập tin đầu ra như:

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

Tôi đã sửa đổi thuật toán của bạn để tạo định dạng FILENAME-YYYY_MM. Tôi bị mắc kẹt trong câu hỏi của mình. –

Các vấn đề liên quan