2011-03-25 9 views
40

मूल रूप से मैं सोच रहा हूँ क्यों इस उत्पादन के लिए कुछ भी नहीं करता है:grep का उपयोग करते समय दो बार क्यों नहीं दिखाया जाता है?

tail --follow=name file.txt | grep something | grep something_else 

आप मान सकते हैं कि यह उत्पादन का उत्पादन करना चाहिए मुझे यह बताते हुए

cat file.txt | grep something | grep something_else 

ऐसा लगता है कि आप कर सकते हैं 'लगता है एक और लाइन चलाने टी एक बार से अधिक पूंछ के उत्पादन पाइप !? किसी को पता है कि सौदा क्या है और क्या कोई समाधान है?

संपादित करें: अब तक सवालों के जवाब देने के लिए, फ़ाइल में निश्चित रूप से सामग्री है जो grep द्वारा प्रदर्शित की जानी चाहिए। साक्ष्य के रूप में ग्रेप इसलिए की तरह किया है, तो है:

tail --follow=name file.txt | grep something 

आउटपुट ठीक से दिखाई देता है, लेकिन इस के बजाय प्रयोग किया जाता है:

tail --follow=name file.txt | grep something | grep something 

कोई उत्पादन दिखाया गया है।

मैं ubuntu चला रहा हूँ बिल्कुल उपयोगी में हैं 10.04

+0

[कैसे एक सतत धारा 'grep' करने के लिए?] (https://stackoverflow.com/q/7161821/995714) –

उत्तर

84

तुम भी जब एक पाइप के अंदर ग्रेप बफरिंग के साथ एक समस्या हो सकती हैं। यानी, आप से

tail --follow=name file.txt | grep something > output.txt 

उत्पादन नहीं दिखाई देंगे क्योंकि ग्रेप का अपना उत्पादन बफ़र होगी।

उपयोग ग्रेप के लिए --line-बफ़र स्विच इससे बचने के लिए:

tail --follow=name file.txt | grep --line-buffered something > output.txt 

यह उपयोगी है आप में से परिणाम प्राप्त करना चाहते हैं के रूप में तेजी से संभव के रूप में output.txt फ़ाइल में का पालन करें।

+0

बस इस पर वापस जांचें और अपना समाधान देखें। मेरे समाधान के मुकाबले बहुत साफ और सटीक, सही समाधान के रूप में चिह्नित किया गया। निश्चित रूप से – radman

-1

तुम्हें पता है कि फ़ाइल के अंतिम दस लाइनों के साथ डिफ़ॉल्ट रूप से tail शुरू होता है? मेरा अनुमान है कि cat संस्करण सब कुछ अतीत में अच्छा है। फ़ाइल की शुरुआत से शुरू करने के लिए tail -n+1 --follow=name file.txt आज़माएं।

-1

मैक पर मेरे लिए काम करता है --follow=name

bash-3.2$ tail delme.txt | grep po 
position.bin 
position.lrn 
bash-3.2$ tail delme.txt | grep po | grep lr 
position.lrn 
+0

कोशिश की और यह वास्तव में मेरे लिए भी काम करता है, हालांकि --follow = नाम भाग जो मैं प्राप्त करना चाहता हूं उसके लिए महत्वपूर्ण है – radman

+0

बेशक यह अनुवर्ती भाग के बिना काम करता है, क्योंकि यह बफरिंग के कारण होता है, जिसे grep (अनुवर्ती बिना) बाहर निकलने के बाद फ़्लश किया जाता है। –

6

पता लगाया कि क्या यहाँ पर जा रहा था बिना। यह पता चला है कि कमांड यह काम कर रहा है कि आउटपुट कंसोल तक पहुंचने में काफी समय लगता है (मेरे मामले में लगभग 120 सेकंड)। ऐसा इसलिए है क्योंकि मानक आउट पर बफर प्रत्येक पंक्ति को नहीं बल्कि प्रत्येक ब्लॉक को लिखा जाता है। इसलिए फ़ाइल से प्रत्येक लाइन को लिखे जाने के बजाय मुझे हर 2 मिनट या उससे अधिक विशाल ब्लॉक मिलेगा।

यह ध्यान दिया जाना चाहिए कि इस सही ढंग से काम करता है:

tail file.txt | grep something | grep something 

ऐसा नहीं है कि समस्याग्रस्त है --follow=name साथ फ़ाइल के इस प्रकार है।

मेरी प्रयोजनों के लिए मैं इसे चारों ओर एक रास्ता मिल गया, मैं क्या करने का इरादा था एक फाइल करने के लिए पहले ग्रेप के उत्पादन पर कब्जा था, तो कमांड यह होगी:

tail --follow=name file.txt | grep something > output.txt 

इस के चारों ओर एक रास्ता है इसलिए जैसे script आदेश का उपयोग करने के लिए:

script -c 'tail --follow=name file.txt | grep something' output.txt 

स्क्रिप्ट आदेश के उत्पादन में कब्जा है और यह फाइल करने के लिए लिखते हैं, इस प्रकार दूसरा पाइप से परहेज।

इसने मेरे लिए इस मुद्दे के आसपास प्रभावी ढंग से काम किया है, और मैंने समझाया है कि आदेश क्यों काम नहीं कर रहा था, समस्या हल हो गई।

FYI करें, ये अन्य stackoverflow सवाल से संबंधित हैं:
Trick an application into thinking its stdin is interactive, not a pipe
Force another program's standard output to be unbuffered using Python

-1

grep पैटर्न फ़ाइल नाम | grep पैटर्न | grep पैटर्न | grep पैटर्न ......

+0

, लेकिन 'पूंछ' के साथ संयोजन इस समस्या का महत्वपूर्ण हिस्सा है ... – radman