मैं एक कमांड के आउटपुट को कई कमांड में कैसे पास करूंगा?


20

प्रक्रिया प्रतिस्थापन या समूहन और पाइपिंग के उपयोग से, आउटपुट आउटपुट ( stdout ) को कमांड के एक सेट को दूसरे कमांड के इनपुट के रूप में पास कर सकता है ।

उदाहरण :

wc < <(echo hi;echo bye)
(echo hi; bye) | wc

लेकिन क्या इसके विपरीत है?

यही है, क्या एक कमांड के आउटपुट को इनपुट में कई अन्य कमांड के इनपुट के रूप में भेजने का एक तरीका है लाइन ?

कुछ इस तरह :

cat testfile | wc | tail -n 5

( पाइपलाइनों का शाब्दिक अर्थ न लें )। यहां मैं cat testfileदोनों का आउटपुट पास करने की कोशिश कर रहा हूंwc औरtail -n 5

एक और उदाहरण होगा:

( एक वाक्य के अंतिम शब्द पाने के लिए )

echo "some random words"| wc -c | cut -f(out put of wc -c) (output of first echo)

जवाबों:


21

शीघ्र जवाब। आप tee >(what_to_do) >(another_thing_to_do)अपने आदेश के साथ जाने के लिए उपयोग कर सकते हैं कि आप कितने अलग-अलग काम करना चाहते हैं।

उदाहरण:

मूल परीक्षण फ़ाइल आउटपुट:

:~$ cat testfile.txt 
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616

teeकमांड के साथ आउटपुट जोड़ा गया:

:~$ cat testfile.txt | tee >(tail -1) >(wc) >(awk '{print $3,$1,$2}')
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
      2      10      91
Serial Number:    TW0XFJWX550854187616

टी में प्रत्येक कमांड केवल सामान्य कमांड है जिसे आप कमांड लाइन पर उपयोग करेंगे, जैसे कि >(head -1 | wc)कार्यों में भी जोड़ सकते हैं ।

:~$ cat testfile.txt | tee >(tail -1) >(head -1 | wc)  >(awk '{print $3,$1,$2}')
Device Model:     LITEONIT LCS-256M6S 2.5 7mm 256GB
Serial Number:    TW0XFJWX550854187616
      1       7      52
LITEONIT Device Model:
TW0XFJWX550854187616 Serial Number:
Serial Number:    TW0XFJWX550854187616

या फिर आप भी उपयोग करके अंतिम पंक्ति कहते हैं की अंतिम शब्द प्राप्त कर सकते हैं awkके साथ $NFएक साथ wcके साथ-साथ इस तरह:

:~$ cat testfile.txt | tail -1 | tee >(wc) >(awk '{print $NF}')
Serial Number:    TW0XFJWX550854187616
TW0XFJWX550854187616
      1       3      39

नोट:| पाइप कमांड को अंत तक जोड़ना कमांड से कई कमांड का उपयोग करके ओवरराइड कर सकता है tee। मेरे पास कुछ उदाहरण हैं जिनका मैं परीक्षण कर रहा हूं:

उदाहरण 1 (सभी अंतिम शब्दों को खींचते हुए पाइप कमांड):

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $NF}'
words
24
5
1

उदाहरण 2 (wc कमांड के आउटपुट को नहीं दिखाता है। पाइप कमांड 3 शब्द को हथियाने वाला है।)

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) | awk '{print $3}'
just

उदाहरण 3 (इको लाइन के तीसरे शब्द को पकड़ना। टी कमांड)।

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $3}')
This is just five words
just
24
5
1

उदाहरण 4 (इको लाइन के अंतिम शब्द को पकड़ना। टी कमांड)।

:~$ echo "This is just five words" | tee >(wc -l) >(wc -w) >(wc -c) >(awk '{print $NF}')
This is just five words
words
24
5
1

उम्मीद है की यह मदद करेगा!


3
मुझे टी और कॉफ़ी बहुत पसंद है! '-)
एल्डर गीक

1
विभिन्न उपभोक्ताओं के बीच आउटपुट के आदेश के बारे में बयान teeगलत है। आमतौर पर आपको सही ऑर्डर मिलने का कारण यह है कि कम लोड मशीन पर, पहले उपभोक्ता प्रक्रिया पहले चलती है। एक व्यस्त मशीन पर, पहले उपभोक्ता को कुछ भी प्रिंट करने से पहले सोने के लिए रखा जा सकता है।
मैतेई डेविड

@MateiDavid मैं इसे अन्यथा साबित नहीं कर सकता, इसलिए मैंने सिर्फ बयान को हटा दिया। कोई बड़ाई नहीं।
टेरेंस

2
मेरा जवाब देखिए। लेकिन अधिक गंभीरता से, teeउपभोक्ताओं के बारे में कोई विचार नहीं है- वे bashलाइन को संसाधित करने वाले लोगों द्वारा बनाए गए हैं । यह सब bashखुले फाइल के डिस्क्रिप्टर की नकल करना है। इसके अलावा, आपके पास एक ही फ़ाइल पर खोले गए विवरणों को दर्ज करने के लिए कई उपभोक्ता हैं। कर्नेल उस का ध्यान रखता है, लेकिन निश्चित रूप से वे bashकमांड लाइन पर दिखाई देने वाला आदेश एक कारक नहीं होगा।
मैतेई डेविड

17

आपको teeस्ट्रीम को भागों में विभाजित करने की आवश्यकता है। प्रयत्न:

cat testfile | tee >(wc -l) >(wc -w) >(wc -c) | tail -n 5

टिप्पणियाँ:

  • कई प्रक्रियाओं (यदि wc, tail) सभी stdout के लिए लिख रहे हैं:

    • आपको आउटपुट प्राप्त हो सकता है।

    • उस क्रम के बारे में कोई गारंटी नहीं है जिसमें उनका आउटपुट दिखाई देगा। इसे देखने के लिए, sleep 1; wc -wदूसरे उपभोक्ता के रूप में प्रयास करें ।

  • teeयदि कोई भी अपने गंतव्य को तेजी से पर्याप्त मात्रा में उपभोग नहीं करता है तो वह अवरुद्ध हो जाएगा। मतलब, गंतव्यों को लगभग समान गति से इनपुट दिया जाएगा (मोड्यूलो तय आकार के बफरिंग)। इसके लिए कोई आसान निर्धारण नहीं है, एकमात्र विकल्प स्ट्रीम को एक फ़ाइल में सहेजना है, और इसे उपभोक्ताओं को अलग से खिलाना है। के लिए wcऔर tailयह एक मुद्दा नहीं है।

अंतिम शब्द के लिए, यह करना सरल है:

echo "some random words" | awk '{print $NF}'

5

moreutilsपैकेज आदेश प्रदान करता है pee(पाइप और टी के विलय, तुम्हें क्या लगता था?) जो वास्तव में है कि नहीं करता है।

अपने पहले उदाहरण के लिए, आप उपयोग करेंगे:

cat testfile | pee wc "tail -n 5"

दूसरा उदाहरण अधिक जटिल है क्योंकि आप अंतिम कमांड में दो इनपुट पास करना चाहते हैं। मैं शायद उपयोग करूंगाawk अन्य उत्तरों के रूप में ।

लिंक: https://joeyh.name/code/moreutils/

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