linux - एक निरंतर धारा 'grep' कैसे करें?




bash shell (7)

Grep के बजाय awk (एक और महान बैश उपयोगिता) का उपयोग करें जहां आपके पास लाइन buffered विकल्प नहीं है! यह पूंछ से आपके डेटा को लगातार स्ट्रीम करेगा।

इस तरह आप grep का उपयोग करते हैं

tail -f <file> | grep pattern

इस तरह आप अजीब का उपयोग करेंगे

tail -f <file> | awk '/pattern/{print $0}'

क्या एक निरंतर स्ट्रीम पर grep का उपयोग करना संभव है?

मेरा मतलब है कि tail -f <file> कमांड की तरह है, लेकिन आउटपुट पर grep साथ केवल रूचि रखने वाले लाइनों को रखने के लिए।

मैंने tail -f <file> | grep pattern की कोशिश की है tail -f <file> | grep pattern लेकिन ऐसा लगता है कि grep को केवल tail खत्म होने के बाद ही निष्पादित किया जा सकता है, जो कभी नहीं कहता है।


आप इस उत्तर को वृद्धि के रूप में देख सकते हैं .. आमतौर पर मैं इसका उपयोग कर रहा हूं

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

फ़ाइल घुमाए जाने के मामले में एफ बेहतर है (अगर फ़ाइल घुमाएगी तो एफ ठीक से काम नहीं करेगा)

-ए और -बी पैटर्न घटना से पहले और बाद में लाइनों को पाने के लिए उपयोगी है .. ये ब्लॉक धराशायी लाइन विभाजक के बीच दिखाई देंगे


ज्यादातर मामलों में, आप tail -f /var/log/some.log |grep foo कर सकते हैं और यह ठीक काम करेगा।

यदि आपको चल रहे लॉग फ़ाइल पर एकाधिक greps का उपयोग करने की आवश्यकता है और आपको लगता है कि आपको कोई आउटपुट नहीं मिलता है, तो आपको अपने मध्य grep (ओं) में --line-buffered स्विच को --line-buffered आवश्यकता हो सकती है, जैसे:

tail -f /var/log/some.log | grep --line-buffered foo | grep bar

बीएसडी grep (फ्रीबीएसडी, मैक ओएस एक्स इत्यादि) का उपयोग करते समय grep के लाइन बफरिंग मोड को चालू करें।

tail -f file | grep --line-buffered my_pattern

आपको जीएनयू grep (किसी भी लिनक्स पर बहुत अधिक इस्तेमाल किया जाता है) के लिए ऐसा करने की ज़रूरत नहीं है क्योंकि यह डिफ़ॉल्ट रूप से फ्लश करेगा (अन्य यूनिक्स-पसंद जैसे स्मार्टस, एईक्स या क्यूएनएक्स के लिए वाईएमएमवी)।


मैं tail -f <file> | grep <pattern> उपयोग करता हूं tail -f <file> | grep <pattern> हर समय।

यह grep flushes तक इंतजार करेगा, जब तक यह खत्म नहीं होता है (मैं उबंटू का उपयोग कर रहा हूँ)।


यदि आप पूरी फ़ाइल में मिलान नहीं करना चाहते हैं (न केवल पूंछ), और आप इसे बैठना चाहते हैं और किसी भी नए मैच की प्रतीक्षा कर रहे हैं, तो यह अच्छी तरह से काम करता है:

tail -c +0 -f <file> | grep --line-buffered <pattern>

-c +0 ध्वज का कहना है कि आउटपुट फ़ाइल के आरंभ ( + ) से 0 बाइट्स ( -c ) शुरू करना चाहिए।


sed उचित आदेश होगा ( स्ट्रीम संपादक)

tail -n0 -f <file> | sed -n '/search string/p'

और फिर यदि आप एक विशेष स्ट्रिंग मिलने के बाद पूंछ कमांड से बाहर निकलना चाहते थे:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

स्पष्ट रूप से एक बशर्वाद: $ BASHPID पूंछ कमांड की प्रक्रिया आईडी होगी। पाइप में पूंछ के बाद sed command अगली है, इसलिए sed process id $ BASHPID + 1 होगी।







tail