काम नहीं करने के लिए grep से पाइपिंग


34

मैं फ़ाइल लॉग grepके चल रहे प्रयास कर रहा हूँ tailऔर nएक पंक्ति से वें शब्द मिलता है । उदाहरण फ़ाइल:

$ cat > test.txt <<EOL
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
EOL
^C

अब अगर मैं tail:

$ tail -f test.txt
Beam goes blah
John goes hey
Beam goes what?
John goes forget it
Beam goes okay
Beam goes bye
^C

मैं तो grepयह है कि tail:

$ tail -f test.txt | grep Beam
Beam goes blah
Beam goes what?
Beam goes okay
Beam goes bye
^C

लेकिन अगर मैं awkकि grep:

$ tail -f test.txt | grep Beam | awk '{print $3}'

कुछ भी नहीं मैं कितनी देर तक प्रतीक्षा करता हूं। मुझे संदेह है कि यह धारा के काम करने के तरीके के साथ कुछ करना है।

किसी को कोई सुराग है?

जवाबों:


55

यह शायद grep से आउटपुट बफ़रिंग है। आप के साथ है कि निष्क्रिय कर सकते हैं grep --line-buffered

लेकिन आपको grep से awk में पाइप आउटपुट करने की आवश्यकता नहीं है। awk regexp पैटर्न को खुद से ही मैच कर सकता है।

tail -f test.txt | awk '/Beam/ {print $3}'


8

tail -f test.txt | awk '/Beam/{print $3}'मेरे लिए काम का उपयोग करना । साथ ही उपयोग tail -f test.txt | grep --line-buffered Beam | awk '{print $3}'(gnu grep)।

यहां समस्या यह है कि क्या awkडेटा लाइन-बाय-लाइन या एक बड़े डेटा ब्लॉक के रूप में प्राप्त होता है। Grep का GNU संस्करण बड़े ब्लॉकों में आउटपुट भेजता है क्योंकि यह अधिक कुशल है, लेकिन awkलाइन-बाय-लाइन को आउटपुट लाइन-बाय-लाइन पढ़ने के लिए आवश्यक है।

इस तरह से डालें: grepकेवल डेटा तभी भेजेगा जब बफर भरा होगा, awk को उस बफर के भरने का इंतजार है, इसलिए वह कुछ भी नहीं भेज रहा है।


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