2012-12-13 17 views
16

एक ठेठ अपाचे पहुँच लॉग के साथ जा रहे हैं, तो आप चला सकते हैं:पाइपिंग पूंछ उत्पादन हालांकि ग्रेप दो बार

tail -f access_log | grep "127.0.0.1" 

कौन सा केवल आप निर्दिष्ट IP पते के लिए लॉग (के रूप में वे बनाई गई हैं) दिखाई देगा।

लेकिन जब आप परिणाम को और सीमित करने के लिए grep दूसरी बार पाइप करते हैं तो यह विफल क्यों होता है?

उदाहरण के लिए, एक साधारण ".css" के लिए निकालें:

tail -f access_log | grep "127.0.0.1" | grep -v ".css" 

किसी भी उत्पादन नहीं दिखाया जाएगा।

+0

भी देखें (http [पूंछ -f पर डबल ग्रेप कोई उत्पादन देता है]: //unix.stackexchange.com/a/164681/20661) – rubo77

उत्तर

31

मेरा मानना ​​है कि यहां समस्या यह है कि पहला जीपीआर आउटपुट को बफर कर रहा है जिसका मतलब है कि दूसरी grep तब तक नहीं देखेगी जब तक बफर फ़्लश नहीं हो जाता।

अपना पहला ग्रेप पर --line-buffered विकल्प जोड़ने का प्रयास करें:

tail -f access_log | grep --line-buffered "127.0.0.1" | grep -v ".css" 

अधिक जानकारी के लिए, देखें "BashFAQ/009 -- What is buffering? Or, why does my command line produce no output: tail -f logfile | grep 'foo bar' | awk ..."

10

यह बफरिंग का परिणाम है, यह अंततः प्रिंट होगा जब पर्याप्त डेटा उपलब्ध है।

रूप शॉन चिन ने सुझाव दिया है या अगर stdbuf उपलब्ध है आप के साथ एक ही प्रभाव प्राप्त कर सकते हैं --line-buffered विकल्प का उपयोग करें:

tail -f access_log | stdbuf -oL grep "127.0.0.1" | grep -v ".css" 
+0

धन्यवाद थोर, आपका भी सही है, लेकिन मुझे लगता है कि शॉन आपके सामने बस वहां पहुंचे थे। –