मैं tail -f
अपने लॉग करना चाहता हूं। हालाँकि, मैं उन सभी चीज़ों को फ़िल्टर करना चाहता हूं जिनमें शब्द हैं:
"ईएलबी", "पीएसटीपी", "स्वास्थ्य"
मैं tail -f
अपने लॉग करना चाहता हूं। हालाँकि, मैं उन सभी चीज़ों को फ़िल्टर करना चाहता हूं जिनमें शब्द हैं:
"ईएलबी", "पीएसटीपी", "स्वास्थ्य"
जवाबों:
मुझे grep के बजाय awk का उपयोग करने के बारे में पता नहीं है, लेकिन यह मेरे लिए काम करता है:
tail -f file.log | grep -Ev '(ELB|Pingdom|Health)'
EDIT: जैसा कि dmourati और Caleb ने बताया, आप सुविधा egrep
के grep -E
लिए उपयोग कर सकते हैं । कुछ प्रणालियों पर यह उसी बाइनरी के लिए एक लिंक होगा, दूसरों में इसकी एक प्रति grep पैकेज द्वारा आपूर्ति की जाती है। किसी भी तरह से यह -E
स्विच के विकल्प के रूप में रहता है । हालाँकि, GNU grep मैन पेज के अनुसार:
[…] दो संस्करण कार्यक्रम
egrep
औरfgrep
उपलब्ध हैं।egrep
के रूप में ही हैgrep -E
।fgrep
के रूप में ही हैgrep -F
। प्रत्यक्ष रूप से मंगलाचरणegrep
या तोfgrep
पदावनत कर दिया जाता है, लेकिन ऐतिहासिक अनुप्रयोगों की अनुमति देने के लिए प्रदान किया जाता है जो उन पर भरोसा करते हैं जो अनमॉडिफाइड हैं।
जब से वे पर्यायवाची आदेश हैं, तब तक यह वरीयता में नीचे आता है जब तक कि आपके पास egrep नहीं है। हालांकि आगे की संगतता के लिए इसे grep -E
सिंटैक्स का उपयोग करने की सिफारिश की जाती है क्योंकि अन्य विधि आधिकारिक तौर पर पदावनत है।
grep -E
बजाय egrep
डुप्लिकेट उत्तर का उपयोग करना है ?
sed
, awk
, perl
, multitail
या ninja_foo
।
इसे एक ऐसे पाइप से अलग करने की कोशिश करें जिसे आप अलग-अलग शब्दों की सूची से अलग करना चाहते हैं:
tail -f log_file | egrep -v 'ELB|Pingdom|Health'
ध्यान दें कि मैचों की सूची के आसपास कोष्ठक का उपयोग करना वैकल्पिक है। चूँकि |
grep द्वारा एक तार्किक या ऑपरेटर के रूप में व्यवहार किया जाता है, चाहे वह उप-समूह के हिस्से के रूप में हो या न हो। '(ELB|Pingdom|Health)'
ठीक उसी तरह काम करेगा। कुछ के लिए, वाक्यविन्यास अधिक स्पष्ट हो सकता है; मुझे बिना टाइपिंग करना आसान लगता है क्योंकि मैं सिंगल मैच से संभव मैचों की सूची में बदल सकता हूं, बिना कोष्ठक जोड़ने के लिए।
अतिरिक्त क्रेडिट के लिए, यह उल्लेखनीय है कि multitail
आउटपुट को फ़िल्टर करने पर निंजा फू करता है। उदाहरण के लिए आप अपने शब्दों को इस तरह से फ़िल्टर कर सकते हैं:
multitail -e ELB -e Pingdom -e Health -f log_file
आप इसे केवल फ़िल्टर करने के बजाय आउटपुट को रंग या अन्यथा हाइलाइट करने के लिए उपयोग कर सकते हैं।
संपादित करें: देखें DTests जवाब और कैसे egrep सिर्फ एक पदावनत वैकल्पिक बंद आग तरीका है की पूरी जानकारी के लिए टिप्पणियां grep -E
।
आप इस जानकारी को लॉग इन क्यों करना चाहते हैं?
यदि आप लॉग फ़ाइलों की सामग्री के आधार पर स्क्रिप्टेड व्यवहार करना चाहते हैं, तो आप एक्सपेक्ट का उपयोग करके अपने फ़िल्टरिंग को करने की इच्छा कर सकते हैं। ( http://en.wikipedia.org/wiki/Expect ) एक्सपेक्ट एक Tcl एक्सटेंशन है लेकिन एक्सपेक्ट का एक पायथन संस्करण भी है।
अपेक्षा आपको स्टेटमेंट या स्टेटमेंट आपके इनपुट स्ट्रीम में मौजूद पैटर्न के आधार पर अलग-अलग व्यवहार निर्दिष्ट करने देती है, जिससे आपको यह शक्तिशाली लचीला स्विच मिलता है। उदाहरण के लिए:
expect {
"password:" {
send "password\r"
}
"yes/no)?" {
send "yes\r"
set timeout -1
}
timeout {
exit
}
-re . {
exp_continue
}
eof {
exit
}
}
इसलिए आप अपेक्षित विवरण में पैटर्न निर्दिष्ट करते हैं, और आप विभिन्न व्यवहारों को निर्दिष्ट करते हैं, और आप पूरी चीज को एक लूप में लपेट सकते हैं, और आप बहुत शक्तिशाली फिल्टर आसानी से लिख सकते हैं, जो आपके इनपुट के भागों को अलग-अलग फाइलों में लिखते हैं, या इसे पूरी तरह से छोड़ देते हैं, या आपके इनपुट में क्या है इसके आधार पर कार्रवाई करें और अन्य स्क्रिप्ट चलाएं।
तो, यह नीचे आता है कि आप लॉग इनपुट पर कार्रवाई करने के लिए, या केवल अभिलेखीय कारणों से अपनी लॉग फ़ाइलों को फ़िल्टर करने की कोशिश क्यों कर रहे हैं?