2013-01-16 7 views
13

मैं कुछ लॉग फ़ाइलों की निगरानी के लिए एक खोल स्क्रिप्ट बनाने की कोशिश कर रहा हूं। मैं इस तरह के आदेश का उपयोग कर रहा हूँ: लॉग फ़ाइलपूंछ में grep में gf में ठीक से काम नहीं कर रहा है

tail -f /var/somelog | grep --line-buffered " some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " " 

की तरह है:

some test and p l a c e h o l d e r 3 
some test and p l a c e h o l d e r 4 
some test and p l a c e h o l d e r 5 
some test and p l a c e h o l d e r 6 

और इतने पर .. मेरे मुद्दा यह है कि आदेश के उत्पादन में पिछले प्रदर्शित नहीं करता है लाइन

some test and p l a c e h o l d e r 6 

लाइन तक

some test and p l a c e h o l d e r 7 

लॉग में जोड़ा गया है।

मुझे उम्मीद है कि मैंने अपना मुद्दा स्पष्ट कर दिया है। क्या कोई इसे हल करने में मेरी मदद कर सकता है? धन्यवाद :)

+4

हो सकता है कि लॉग लाइन लाइन लाइन के साथ समाप्त नहीं हो रहे हैं, लेकिन इसके बजाय एक के साथ शुरू किया? इस मामले में लाइन 6 वास्तव में तब तक पूर्ण नहीं होगी जब तक कि लाइन 7 शुरू नहीं होती है और वह लाइन फ़ीड प्रदान करती है। यदि आप लॉग फ़ाइल देखते हैं, तो सभी वर्ण दिखाते हुए, क्या आप अंतिम पंक्ति के अंत में एक लाइन फ़ीड देखते हैं? –

+0

'od -c/var/somelog' का उपयोग कर पिछली नई लाइन ("\ n") की तलाश करें। – cdarke

+0

क्या आप वही आउटपुट देखते हैं जो सिर्फ 'tail -f' के साथ है? यदि ऐसा है तो @ डेविड ने इसे सही तरीके से इंगित किया है। – mtk

उत्तर

19

समस्या लगभग निश्चित रूप से संबंधित है कि कैसे grep और कट आउटपुट उनके आउटपुट से संबंधित है। यहाँ एक हैक है कि आप समस्या को हल करना चाहिए है, हालांकि मुझे यकीन है कि वहाँ खूबसूरत तरीके यह करने के लिए कर रहे हैं रहा हूँ:

tail -f /var/somelog | while read line; do echo "$line" | grep "some test and p l a c e h o l d e r" | cut -f 3,4,14 -d " "; done 

वैकल्पिक रूप से (आदेश के अंत में ; done मत भूलना) क्योंकि gawk यह उत्पादन है बफ़र नहीं होता, तो आप इसे cut के स्थान पर बोझिल जबकि पाश से बचने के लिए इस्तेमाल कर सकते हैं:

tail -f log | grep --line-buffered "some test and p l a c e h o l d e r" | gawk '{print $3,$4,$14}' 

बाहर http://www.pixelbeat.org/programming/stdio_buffering/ बफरिंग समस्याओं के बारे में अधिक जानकारी के लिए चेक।

+1

यह भी काफी संभावना है कि जो कुछ भी '/ var/somelog' पर लिख रहा है वह बफरिंग कर रहा है, इसलिए 'पूंछ' तब तक परिवर्तन नहीं देख सकता जब तक कि यह बफर ओवरफ्लो न हो या उसके आउटपुट को किसी अन्य तरीके से फ़्लश न करे ... – twalberg

+0

मैंने पहले समाधान की कोशिश की है और काम कर रहा है। आपके सहयोग के लिए धन्यवाद! –

+0

मदद करने में खुशी हुई। यह न भूलें कि यहां चारों ओर धन्यवाद देने का सबसे अच्छा तरीका सहायक उत्तर स्वीकार/अपवर्तित करना है! :) – nullrevolution

संबंधित मुद्दे