एक लॉग फ़ाइल को पूंछें लेकिन केवल विशिष्ट लाइनें दिखाएं


29

-F ध्वज के साथ मैं एक लॉग फ़ाइल को पूँछ रहा हूँ। तब मैं इसे grep करने के लिए पाइप कर रहा हूं, केवल "X" वाली लाइनों को खोजने के लिए। वह पूरी तरह से ठीक काम कर रहा है। अब मैं इसे फिर से एक और दरार में डालना चाहता हूं, जिससे "Y" वाली सभी लाइनें निकल जाएंगी। जब मैं दूसरा पाइप जोड़ता हूं, तो फ़ाइल ताज़ा हो जाती है और ऐसा लगता है कि कोई डेटा नहीं आ रहा है।

यह वह आदेश है जो काम करता है: tail -f my_file.log | grep "X"

यह वह आदेश है जो नहीं है: tail -f my_file.log | grep "X" | grep -v "Y"

मुझे यह कैसे करना चाहिए ताकि कमांड काम करे?


1
एक पाइप से एक पाइप करने की कोशिश करो, अनुक्रम को बदलो, करो tail -f file|grep -v "Y"। अगर आउटपुट ठीक है तो आगे बढ़ें grep "X"
आइज़ुद्दीन ज़ली

जवाबों:


38

जैसे-जैसे आउटपुट grepबफ़र्ड होता है, लाइन बफ़रिंग सक्षम करने के --line-bufferedविकल्प का उपयोग grepकरें:

tail -f /path/to/log | grep --line-buffered 'X' | grep -v 'Y'

यदि आपके grepपास विकल्प नहीं है, तो आप विकल्प के stdbufरूप में उपयोग कर सकते हैं :

tail -f /path/to/log | stdbuf -oL grep 'X' | grep -v 'Y'

1
मैं सोच रहा हूं कि कैसे stdbufबताता है कि libstdbuf.soकौन सी सेटिंग्स का उपयोग करना है।
कास्परड

@kasperd: पर्यावरण चर।
नैट एल्ड्रेडगे

1
@ NateEldredge मैं पहले से ही आउटपुट में पर्यावरण चर के लिए देखा diff -u <(env) <(stdbuf env)और कोई नहीं मिला। लेकिन अब मुझे एहसास हुआ कि मुझे जो परीक्षण करना चाहिए था, वह था diff -u <(env) <(stdbuf -oL env)
कास्परड

मैं भी उसी तरह की समस्या हूँ। मेरा मामला यह है कि, मुझे सभी लाइनों को प्रिंट करने की आवश्यकता है जिनमें 'आआ' और 'बब्ब' हैं। पहले समाधान से ऊपर काम नहीं कर रहा है। दूसरा समाधान 'आ' मौजूद है और 'बीब' मौजूद नहीं है। दोनों मौजूद नहीं हैं। कोई आउटपुट नहीं दे रहा है। मेरी कमांड इस तरह दिखती है: tail -f test.txt | stdbuf -oL grep 'aaa' | grep 'bbb' यह कोई आउटपुट नहीं दे रहा है। क्या आप मेरी मदद कर सकते हैं।
रवि

18

मैं आम तौर पर awkइस तरह की तार्किक जांचों के लिए अधिक उपयोगी पाता हूं :

tail -f /path/to/log | awk '/X/ && !/Y/'
#                           ^^^    ^^^^
#                   this I want    but not this

दो टैब होने से परीक्षण किया गया, जिसमें एक मैं लिखता रहा seq 20 >> myfileऔर दूसरा उदाहरण के लिए tail -f myfile | awk '/3/ && !/13/'


15

एक और तरीका यह होगा कि grepदो के बजाय एक एकल मंगलाचरण का उपयोग करें और इसलिए बफरिंग मुद्दे से बचें। बस एक नियमित अभिव्यक्ति का उपयोग करें जो 0 या अधिक गैर-वाई वर्णों से मेल खाती रेखाओं से मेल खाती है, फिर एक X और फिर 0 या अधिक गैर-Ys फिर से पंक्ति के अंत तक "

tail -f /path/to/log | grep '^[^Y]*X[^Y]*$'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.