"पूंछ -f" आउटपुट को किसी अन्य फ़ाइल में लिखना


34

अपनी अंतिम पोस्ट से निरंतरता के रूप में जहाँ मैंने grep & tail -f"दुर्लभ" घटनाओं के घटित होने का पता लगाया है। मैं इसे दूसरी फाइल में दर्ज करना चाहूंगा।

मैंने मुड़ने की कोशिश की है

tail -f log.txt | egrep 'WARN|ERROR'

में

tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

फ़ाइल बन जाती है, लेकिन कुछ भी आबाद नहीं है, क्या यह एक कैशिंग मुद्दा है या अन्यथा? मुझे अपनी पूंछ के आउटपुट को एक नई फ़ाइल में जोड़ने का वास्तविक समय कैसे मिलेगा?

जवाबों:


44

बफरिंग की समस्या है।

इस तरह करो,

tail -f log.txt | egrep - लाइन-बफ़र्ड 'WARN | ERROR' | टी फिल्टर्ड_आउटपुट। टेक्स
#>

साइगविन पर भी काम करने की पुष्टि की।


6

यह शायद एक बफरिंग मुद्दा है। पाइप का उपयोग करते समय ऑटो-बफरिंग को अक्षम करने पर इस एसओ पोस्ट को देखें । आप unbufferसे कमांड का उपयोग कर सकते हैं expect:

$ unbuffer tail -f log.txt | egrep 'WARN|ERROR' | tee filtered_output.txt

संपादित करें : चूंकि आपके पास एक लंबी पाइपलाइन है, इसलिए आपको संभवतः प्रत्येक कमांड को अनबफर करने की आवश्यकता है (अंतिम को छोड़कर):

$ unbuffer tail -f log.txt | unbuffer egrep 'WARN|ERROR' | tee filtered_output.txt

संपादित 2 : स्रोत पैकेज से साइगविनunbuffer पर उपलब्ध है expect(उदाहरण के लिए -20030128-1-src.tar.bz2 , expect/examplesफ़ोल्डर में पाया गया ), लेकिन यह एक बहुत छोटी स्क्रिप्ट है। यदि आपके पास expectपैकेज पहले से स्थापित है, तो बस इसे unbufferअपनी /usr/local/binनिर्देशिका में लिखी गई स्क्रिप्ट में डालें :

#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

eval spawn -noecho $argv
set timeout -1
expect

डेबियन पर, unbufferकमांड expect-devपैकेज में प्रदान की जाती है और इसे स्थापित किया जाता है expect_unbuffer


वहाँ एक तरीका है इस cygwin के साथ पूरा करने के लिए?
माइक

साइबरविन में उपयोग करने पर अतिरिक्त जानकारी; आपको expectपैकेज की आवश्यकता होगी ।
क्वैक्ट क्विकोट

धन्यवाद, सोमवार तक अब दुख की कोशिश नहीं कर सकता। तब अपडेट करेंगे।
माइक

4

एक ऐसी कमांड का उपयोग करते समय जो वास्तव में 'खत्म' (जैसे tail -f) नहीं होती है, यह वास्तव में वास्तव में काम नहीं करती है या वह अच्छी तरह से (बिल्कुल भी) नहीं होती है।

आपको आउटपुट को टेक्स्ट फाइल पर रीडायरेक्ट करना चाहिए। इसे इस्तेमाल करे:

tail -f log.txt | egrep 'WARN|ERROR' > filtered_output.txt

1
यह काम करने के लिए प्रतीत नहीं होता है।
माइक

2

यह unbufferमेरे पास का संस्करण है:

#!/usr/bin/expect --
# Description: unbuffer stdout of a program
# Author: Don Libes, NIST

if {[string compare [lindex $argv 0] "-p"] == 0} {
    # pipeline
    set stty_init "-echo"
    eval spawn -noecho [lrange $argv 1 end]
    close_on_eof -i $user_spawn_id 0
    interact {
    eof {
        # flush remaining output from child
        expect -timeout 1 -re .+
        return
    }
    }
} else {
    set stty_init "-opost"
    set timeout -1
    eval spawn -noecho $argv
    expect
}

अतिरिक्त जानकारी के लिए +1 धन्यवाद। डननो अगर यह साइबर-फ्रेंडली है, लेकिन यह अधिक बुद्धिमान स्क्रिप्ट की तरह दिखता है।
क्विकोट

2

जैसा कि अन्य ने बताया है, आप unbufferएक्सपेक्ट से उपयोगिता का उपयोग कर सकते हैं ।

हालाँकि, ध्यान दें, कि आपके सिस्टम और एक्सपेक्ट के उपलब्ध संस्करण के आधार पर, आपको -pस्विच को अनफ़र करने की आवश्यकता हो सकती है । मैन पेज का हवाला देते हुए:

   Normally, unbuffer does not read from stdin.  This simplifies use of unbuffer in some situations.  To use unbuffer in a  pipeline,  use
   the -p flag.  Example:

           process1 | unbuffer -p process2 | process3

तो आपको इस आह्वान की आवश्यकता हो सकती है:

unbuffer -p tail -f log.txt | unbuffer -p egrep 'WARN|ERROR' | tee filtered_output.txt

BTW, आउटपुट बफ़रिंग समस्या के पूरी तरह से स्पष्टीकरण के लिए यह लेख देखें: http://www.pixelbeat.org/programming/stdio_buffering/

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