2012-07-29 9 views
8

एक महीने में मौजूदा अपाचे लॉगफाइल को अलग-अलग फ़ाइलों में कैसे विभाजित कर सकता है?महीने में मौजूदा अपाचे लॉगफाइल को कैसे विभाजित करें?

मैंने वेब को खराब कर दिया है और मुझे कुछ भी नहीं मिला है। हाँ, मैं logrotate और cronolog और यह सब के बारे में पता है। लेकिन मुझे जो कुछ भी मिला है, वह मुझे मौजूदा फाइलों को विभाजित करने में मदद नहीं करता है।

क्या कोई अजीब स्क्रिप्ट या कुछ है?

एक तरह से 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)" 

यहाँ मेरी समाधान, बहुत नीचे स्टीव जवाब से प्रेरित है:

यहाँ डेटा का एक टुकड़ा है आउटपुट फाइलें जैसे:

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

एक 150 MB लॉग फ़ाइल के खिलाफ, chepner द्वारा स्वीकृत जवाब एक 3.4 GHz 8 कोर जिऑन E31270 पर 70 सेकंड लगे, जबकि इस विधि 5 सेकंड ले लिया।

मूल प्रेरणा: https://stackoverflow.com/a/11714105/430062

+1

जो लोग awk (या कुछ पता :) जरूरी जानते हैं या आप कोशिश कर रहे हैं डेटा फ़ाइल तक पहुंच नहीं हो सकता:

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

हो जाएगा ताकि उत्पादन फ़ाइलें हेरफेर करने के लिए, यह अच्छा होगा अगर आप यह दिखाने के लिए कुछ इनपुट/आउटपुट जोड़े प्रदान कर सकें कि आप क्या काम कर रहे हैं/यदि संभव हो तो बाहर निकलना चाहते हैं – Levon

+0

मैंने आपके उत्कृष्ट सुझाव को लागू किया है। –

उत्तर

12

एक तरह से awk का उपयोग कर:

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

हो जाएगा ताकि उत्पादन फ़ाइलों की तरह:

May.txt 
June.txt 
July.txt 
etc 

संपादित करें:

शायद आप साल अलग रखने के लिए करना चाहते हैं:

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

मैंने FILENAME-YYYY_MM प्रारूप बनाने के लिए आपके एल्गोरिदम को संशोधित किया है। मैंने इसे अपने प्रश्न में फंस लिया। –