`पूंछ -f` के वास्तविक समय आउटपुट के लिए फ़िल्टर कैसे लागू करें?


60
tail -f path

उपरोक्त तुरन्त फ़ाइल में संशोधनों का उत्पादन करेगा, लेकिन मैं आउटपुट पर एक फ़िल्टर लागू करना चाहता हूं, केवल तब दिखाएं जब इसमें कोई कीवर्ड xxxहो।

इस से कैसे संपर्क करें?


1
स्वीकार किए गए उत्तरों को चिह्नित करने से उन लोगों को मदद मिलती है जो आपके प्रश्नों और उनके उत्तरों को पढ़ने में मदद करते हैं, यह जानने के लिए कि उनके समान प्रश्न या समस्या होने पर किस उत्तर में उनकी मदद करने की अधिक संभावना हो सकती है। आप अपने उपयोगकर्ता नाम पर क्लिक करके अपने पहले के प्रश्नों को फिर से देख सकते हैं।
डेनिस विलियमसन

जवाबों:


84

यूनिक्स के साथ आप एक प्रोग्राम के आउटपुट को दूसरे में पाइप कर सकते हैं।

तो पूंछ को छानने के लिए, आप grep का उपयोग कर सकते हैं:

tail -f path | grep your-search-filter

लेकिन मान लें कि आपके पास पूंछ (फ़ाइल के अंत) में 100 लाइनें हैं, और ये रेखाएं वे हैं जिन्हें आप फ़िल्टर करना चाहते हैं। आपका समाधान
TraderJoeChicago

1
यदि आप केवल फ़ाइल की अंतिम 100 लाइनों को खोजना चाहते हैं तो टेल -100 पथ का प्रयास करें grep xxx
AddersUK

15

संक्षिप्त जवाब: tail -f somefile | grep somepattern

हालांकि, यह कम हो जाता है। मान लें कि आप एक ऐसी फाइल को टटोल रहे हैं जो अक्सर घूम जाती है (यदि इसका डिबग लॉग होता है, तो इसे कई बार घुमाया जा सकता है)। उस मामले tail -Fमें आपका दोस्त है। मैं आपको अंतर देखने दूँगा।

लेकिन tail -fऔर tail -Fपहले लाइनों का एक गुच्छा प्रिंट करें, जो अक्सर इस उपयोग-मामले में अवांछनीय है, इसलिए इस मामले में जोड़ें-n0

tail -F -n0 somefile | grep somepattern

यह तब तक ठीक रहेगा, जब तक आप कुछ अन्य फ़िल्टर करना चाहते हैं, और तब आपको बफरिंग से सावधान रहने की आवश्यकता है। टर्मिनल पर लिखते समय डिफ़ॉल्ट रूप से स्टैडआउट को लाइन-बफ़र किया जाता है लेकिन जब पाइप से लिखते समय पूरी तरह से बफ़र किया जाता है। इसलिए निम्नलिखित रेखाएं जैसे ही मिलेंगी, क्योंकि tailस्पष्ट रूप से लाइन-बफ़र्ड (या यह प्रत्येक पंक्ति के अंत में अपने आउटपुट को फ्लश करता है), और grepलाइन-बफ़र्ड भी है क्योंकि इसका आउटपुट आपके टर्मिनल पर जा रहा है:

tail -F -n0 somefile | grep somepattern

लेकिन फिर आप कुछ का उपयोग करने awkया cutआउटपुट को आगे की प्रक्रिया के लिए तय करते हैं ।

tail -F -n0 somefile | grep somepattern | awk '{print $3}'

और अब आप आश्चर्य करते हैं कि आपका आउटपुट कहां चला गया है ... लॉग की मात्रा के आधार पर, आप पा सकते हैं कि आपको आउटपुट मिलता है, लेकिन यह एक समय में एक पेज होगा क्योंकि अब grepपूरी तरह से बफर फैशन में चल रहा है, और इसलिए awkइसे एक बार में (डिफ़ॉल्ट रूप से) 4kB इनपुट मिलता है।

इस मामले में, आप विकल्प grepका उपयोग करके हमेशा स्टडआउट लाइन को बफ़र करना बता सकते हैं --line-buffered

tail -F -n0 somefile | grep --line-buffered somepattern | ...

हालाँकि, अधिकांश कमांड का एनालॉग नहीं है --line-buffered। अधिक स्क्रिप्ट योग्य टूल के मामले में, आप आउटपुट को फ्लश करने के लिए फ़ंक्शन का उपयोग कर सकते हैं (उदाहरण के लिए awk, फ़ंक्शन वह है fflush(), जो अपने सी समकक्ष के समान नाम को साझा करता है , पर्ल और पायथन जैसे उपकरण कुछ समान हैं)।

पसंद के साथ cutआप किस्मत से बाहर हैं; ... लेकिन आप खोज करने की कोशिश कर सकते हैं unbuffer, जो मुझे लगता है कि expectटूलचिन द्वारा प्रदान किया गया कुछ है (मैंने इसका इस्तेमाल कभी नहीं किया है)।

मुझे आशा है कि आपको यह उपयोगी लगा होगा।

चीयर्स, कैमरन


मैं वास्तव में स्पष्टीकरण की सराहना करता हूं कि यह लाइन-बफ़र्ड मोड में क्यों काम करता है। यह एक उत्कृष्ट अंतर्दृष्टि है, धन्यवाद।
ग्रीन

2

और आप कई पाइप और greps का उपयोग कर सकते हैं, और grep -v के साथ चीजों को बाहर कर सकते हैं, grep -i, आदि के साथ केस असंवेदनशीलता प्राप्त कर सकते हैं।

यानी: टेल -100 एफ / var / लॉग / मैसेज | grep -V एसीपीआई | grep -i अता

अंत से 100 लाइनों को पूंछना शुरू करें, और पूंछते रहें, पहले एसीपीआई के साथ किसी भी रेखा को बाहर करें, फिर एटीए, एटीए या उन में से किसी भी मिश्रण के साथ लाइनें दिखाएं।

एक और आसान एबीसी विकल्प है, लाइनों के बाद, पहले और संदर्भ के लिए (पहले और बाद की लाइनें)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.