एक ही समय में stdout और एक ही समय में उत्पादन करने के लिए आउटपुट


18

मेरे पास एक स्क्रिप्ट है जो टेक्स्ट को आउटपुट करती है stdout। मैं अपने टर्मिनल में यह सब आउटपुट देखना चाहता हूं, और साथ ही मैं कुछ लाइनों को फ़िल्टर करना चाहता हूं और उन्हें एक फ़ाइल में सहेजना चाहता हूं। उदाहरण:

$ myscript
Line A
Line B
Line C

$ myscript | grep -P 'A|C' > out.file

$ cat out.file
Line A
Line C

मैं टर्मिनल में पहले कमांड का आउटपुट देखना चाहता हूं, और दूसरी कमांड के आउटपुट को फाइल में सेव करना चाहता हूं। एक ही समय पर। मैं का उपयोग करने की कोशिश की tee, लेकिन कोई परिणाम नहीं, या बेहतर, उलट परिणाम के साथ

जवाबों:


27

मैं टर्मिनल में पहले कमांड का आउटपुट देखना चाहता हूं, और दूसरी कमांड के आउटपुट को फाइल में सेव करना चाहता हूं।

जब तक आप परवाह नहीं करते हैं कि आप जो देख रहे हैं वह स्टडआउट या स्टडर से है , तब भी आप उपयोग कर सकते हैं tee:

myscript | tee /dev/stderr | grep -P 'A|C' > out.file

लिनक्स पर काम करेंगे; मैं नहीं जानता कि क्या "/ देव / stderr" समान रूप से अन्य * निक्स पर लागू है।


9
/dev/stderrवह सामान्य है। /dev/tty(मतलब वर्तमान टर्मिनल) भी यहाँ काम करेगा, और यह मानक है
गिल्स एसओ- बुराई को रोकना '

@ गिल्स: कमाल है। एक स्क्रिप्ट को टर्मिनल tee /dev/ttyपर प्रिंट stdoutकरने और इसे stdinदूसरे कमांड पर भी पाइप करने की मेरी आवश्यकता के लिए आश्चर्यजनक रूप से सेवा की! Thankees! :-)
जमदग्नि

8
{ ... | tee /dev/fd/3 | grep -e A -e C > out.file; } 3>&1

या प्रक्रिया प्रतिस्थापन के साथ (ksh93, zsh या bash):

... | tee >(grep -e A -e C > out.file)

Zsh के साथ:

... >&1 > >(grep -e A -e C > out.file)

मैंने पाया कि मुझे पहले एक का उपयोग करना था क्योंकि यह grep के निकास कोड को संरक्षित करता है। इसके अलावा, यदि किसी कारण से आप / dev फाइल सिस्टम को एक्सेस नहीं कर पाते हैं, तो /dev/fd/3इसे बदल दिया जा सकता है>(cat 1>&3)
golvok

4

यहाँ एक और तरीका है sed:

myscript | sed '/PATTERN/w out.file'

डिफ़ॉल्ट रूप से, sedइस मामले में तो हर पंक्ति प्रिंट stdout के रूप में ही किया जाएगा stdin (यानी आप के पूरे उत्पादन देखेंगे myscriptस्क्रीन पर)।
इसके अलावा, मिलान करने वाली सभी पंक्तियों PATTERNको wकाट दिया जाएगाout.file


-1

आपने यह नहीं बताया कि आपने टी कमांड का उपयोग कैसे किया है लेकिन यह काम करना चाहिए:

myscript | grep -P 'A|C' | tee out.file

कम से कम यह मेरे सर्वर पर कुछ मिनट पहले काम किया ...


4
लेकिन, अगर मैं गलत नहीं हूं, तो इस तरह से आप स्क्रीन पर भी दिखते हैं। मैं स्क्रीन पर सभी आउटपुट देखना चाहता हूं , और केवल वही फ़िल्टर करना है जो फ़ाइल में जा रहा है।
लोरेंजो-एस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.