जीआरपी लाइन बफरिंग क्या करती है?


25

यहां मेरा आदेश है कि मैं स्क्रिप्ट में grepवास्तविक समय के डेटा का उपयोग कर रहा हूं । यह वास्तविक समय के डेटा को सही ढंग से खींचने के लिए प्रतीत नहीं होता है क्योंकि यह बस कुछ लाइनों को याद करता है।

tail -f <file> | fgrep "string" | sed 's/stuff//g' >> output.txt

निम्नलिखित कमांड क्या करेगी? "लाइन बफरिंग" क्या है?

tail -f <file> | fgrep --line-buffered "string" | sed 's/stuff//g' >> output.txt

जवाबों:


44

गैर-अंतःक्रियात्मक रूप से उपयोग करते समय, अधिकांश मानक कमांड, शामिल हैं grep, आउटपुट को बफर करते हैं, जिसका अर्थ है कि यह तुरंत डेटा नहीं लिखता है stdout। यह लिखने से पहले बड़ी मात्रा में डेटा (लिनक्स में ओएस पर निर्भर करता है, अक्सर 4096 बाइट्स) एकत्र करता है।

आपके आदेश में, grepआउटपुट को पाइप किया गया हैstdin की sedकमान है, इसलिए grepइसके उत्पादन बफ़र।

इसलिए, लाइन बफर का उपयोग --line-bufferedकरने के कारण विकल्प grep, आउटपुट लिखने का अर्थ है कि हर बार यह एक नई लाइन को देखा, बजाय डिफ़ॉल्ट रूप से 4096 बाइट्स तक पहुंचने का इंतजार करने के लिए। लेकिन इस मामले में, आप की जरूरत नहीं है grepसब पर, बस का उपयोग tail+ sed:

tail -f <file> | sed '/string/s/stuff//g' >> output.txt

कमांड जिसमें बफर को संशोधित करने का विकल्प नहीं है, आप GNU कोरुटिल्स stdbuf का उपयोग कर सकते हैं

tail -f <file> | stdbuf -oL fgrep "string" | sed 's/stuff//g' >> output.txt

लाइन बफरिंग या उपयोग चालू करने के लिए -o0बफर को अक्षम करने के लिए करने के लिए।

ध्यान दें

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