एक साथ पाइपिंग कमांड का एक अच्छा उदाहरण क्या है?


33

यदि आप कमांड लाइन पर पाइप की अवधारणा को जानने के लिए किसी की मदद कर रहे थे तो आप किस उदाहरण का उपयोग करेंगे? जो उदाहरण वास्तव में सामने आया वह इस प्रकार था:

cat whatever.txt | less

मुझे लगता है कि इसका सबसे अच्छा उदाहरण नहीं है, क्योंकि वहाँ केवल एक कदम है। क्या एक अच्छा, लेकिन fundemental, का उपयोग है |?

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


3
आपका उदाहरण वास्तव में उतना अच्छा नहीं है - यह मूल रूप से बेकार-उपयोग-के-बिल्ली पुरस्कार के लिए नामांकन है।
मैक्सचलेपिग

@ maxschlepzig ऐसा नहीं है कि आप गलत हैं, लेकिन आप बहुत सहायक नहीं हैं; तुम ठीक काम करता है के catलिए उस की जरूरत नहीं less whatever.txtहै।
बोरा एम। अलपर

जवाबों:


34

मैं आपको एक वास्तविक जीवन परिदृश्य के आधार पर कुछ जटिल उदाहरण के माध्यम से चलने जा रहा हूं।

संकट

मान लें कि conkyमेरे डेस्कटॉप पर कमांड ने प्रतिक्रिया देना बंद कर दिया है, और मैं इसे मैन्युअल रूप से मारना चाहता हूं। मुझे यूनिक्स का थोड़ा बहुत पता है, इसलिए मुझे पता है कि मुझे जो करने की आवश्यकता है वह कमांड निष्पादित है kill <PID>। आदेश पीआईडी को पुनः प्राप्त करने में, मैं उपयोग कर सकते हैं psया topया जो भी उपकरण मेरे यूनिक्स वितरण मुझे दे दिया है। लेकिन मैं इसे एक कमांड में कैसे कर सकता हूं?

उत्तर

$ ps aux | grep conky | grep -v grep | awk '{print $2}' | xargs kill

अस्वीकरण: यह आदेश केवल कुछ मामलों में काम करता है। अपने टर्मिनल में इसे कॉपी / पेस्ट न करें और इसका उपयोग करना शुरू करें, यह बिना सोचे समझे प्रक्रियाओं को मार सकता है। बल्कि इसे बनाना सीखें ।

यह काम किस प्रकार करता है

1- ps aux

यह कमांड रनिंग प्रक्रियाओं की सूची और उनके बारे में कुछ जानकारी का उत्पादन करेगा। दिलचस्प जानकारी यह है कि यह प्रत्येक प्रक्रिया के पीआईडी ​​को अपने दूसरे कॉलम में आउटपुट करेगा। यहाँ मेरे बॉक्स पर कमांड के आउटपुट से एक अर्क है:

$ ps aux
 rahmu     1925  0.0  0.1 129328  6112 ?        S    11:55   0:06 tint2
 rahmu     1931  0.0  0.3 154992 12108 ?        S    11:55   0:00 volumeicon
 rahmu     1933  0.1  0.2 134716  9460 ?        S    11:55   0:24 parcellite
 rahmu     1940  0.0  0.0  30416  3008 ?        S    11:55   0:10 xcompmgr -cC -t-5 -l-5 -r4.2 -o.55 -D6
 rahmu     1941  0.0  0.2 160336  8928 ?        Ss   11:55   0:00 xfce4-power-manager
 rahmu     1943  0.0  0.0  32792  1964 ?        S    11:55   0:00 /usr/lib/xfconf/xfconfd
 rahmu     1945  0.0  0.0  17584  1292 ?        S    11:55   0:00 /usr/lib/gamin/gam_server
 rahmu     1946  0.0  0.5 203016 19552 ?        S    11:55   0:00 python /usr/bin/system-config-printer-applet
 rahmu     1947  0.0  0.3 171840 12872 ?        S    11:55   0:00 nm-applet --sm-disable
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:38 conky -q

2- grep conky

मुझे केवल एक प्रक्रिया में दिलचस्पी है, इसलिए मैं grepअपने कार्यक्रम के अनुरूप प्रविष्टि खोजने के लिए उपयोग करता हूं conky

$ ps aux | grep conky
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q
 rahmu     3233  0.0  0.0   7592   840 pts/1    S+   16:55   0:00 grep conky

3- grep -v grep

जैसा कि आप चरण 2 में देख सकते हैं, कमांड अपनी सूची में प्रक्रिया को psआउटपुट करता grep conkyहै (यह सभी के बाद चलने वाली प्रक्रिया है)। इसे छानने के लिए, मैं चला सकता हूं grep -v grep। विकल्प पैटर्न से युक्त लोगों को छोड़कर सभी लाइनों से मेल खाना -vबताता grepहै ।

$ ps aux | grep conky | grep -v grep
 rahmu     1948  0.2  0.0 276000  3564 ?        Sl   11:55   0:39 conky -q

NB: मैं एक grepकॉल में चरण 2 और 3 करने का तरीका जानना पसंद करूंगा ।

4- awk '{print $2}'

अब जब मैंने अपनी लक्ष्य प्रक्रिया को अलग कर लिया है। मैं इसका पीआईडी ​​प्राप्त करना चाहता हूं। दूसरे शब्दों में, मैं आउटपुट के दूसरे शब्द को पुनः प्राप्त करना चाहता हूं। मेरे लिए भाग्यशाली, अधिकांश (सभी?) आधुनिक इकाइयां awk, एक स्क्रिप्टिंग भाषा का कुछ संस्करण प्रदान करेगी , जो सारणीबद्ध डेटा के साथ चमत्कार करती है। हमारा काम जितना आसान हो जाता है print $2

$ ps aux | grep conky | grep -v grep | awk '{print $2}'
 1948

5- xargs kill

मेरे पास पीआईडी ​​है। बस मुझे इसे पास करना है kill। ऐसा करने के लिए, मैं उपयोग करूंगा xargs

xargs killइनपुट से पढ़ा जाएगा (पाइप से हमारे मामले में), एक कमांड बनाएं जिसमें kill <items>( <items>इनपुट से जो भी पढ़ा जाए) शामिल है, और फिर बनाई गई कमांड को निष्पादित करें। हमारे मामले में यह निष्पादित करेगा kill 1948। मिशन पूरा हुआ।

अंतिम शब्द

ध्यान दें कि आपके द्वारा उपयोग किए जा रहे यूनिक्स के किस संस्करण के आधार पर, कुछ प्रोग्राम अलग तरीके से व्यवहार कर सकते हैं (उदाहरण के लिए, psकॉलम 3 में पीआईडी ​​का उत्पादन कर सकते हैं)। यदि कुछ गलत या अलग लगता है, तो अपने विक्रेता के प्रलेखन (या बेहतर, manपृष्ठों) को पढ़ें । इसके अलावा सावधान रहें क्योंकि लंबे पाइप खतरनाक हो सकते हैं। विशेष रूप से जब की तरह कमांड का प्रयोग किसी भी मान्यताओं मत करो killया rm। उदाहरण के लिए, यदि कोई अन्य उपयोगकर्ता है जिसका नाम 'conky' (या 'Aconkyous') है, तो मेरा कमांड उसके सभी रनिंग प्रोसेस को भी मार सकता है!

मैं जो कह रहा हूं वह सावधान रहना है, खासकर लंबे पाइपों के लिए। अंतःक्रियात्मक रूप से इसे बनाने के लिए हमेशा बेहतर होता है जैसा कि हमने यहां किया था, धारणा बनाने और बाद में खेद महसूस करने के लिए।


NB: मैं एक सिंगल grep कॉल में चरण 2 और 3 करने का तरीका जानना पसंद करूंगा। -> grep "conky -q" :)
वोल्फी

3
वास्तव में यह एक बुरा उदाहरण है, जैसा कि आप बस कर सकते हैंkill $(pgrep conky)
पैट्रिक

5
मुझे पता है कि यह देर हो चुकी है, लेकिन आप इसे और भी सरल बना सकते हैंpkill conky
स्ट्रूजी

2
"" "NB: मैं एक सिंगल grep कॉल में चरण 2 और 3 करने का तरीका जानना पसंद करूंगा।" "इसके बजाय" aux "उपयोग" -o pid, comm "- यह भी अधिक पोर्टेबल है क्योंकि यह POSIX है -compliant। इस तरह से grep प्रक्रिया "grep conky" के बजाय "grep" के रूप में दिखाई देगी, इसलिए यह स्वयं से मेल नहीं खाएगी।
रैंडम 832

2
NB: मैं एक grepकॉल में चरण 2 और 3 करने का तरीका जानना पसंद करूंगा । grep [c]onkyवह है जो आप ढूंढ रहे हैं।
एलेक्सा

15

मेरा पसंदीदा यह है:

youtube-dl $1 -q -o - | ffmpeg -i - $2

दिए गए youtube url से एक वीडियो डाउनलोड करता है $1और इसे दिए गए फ़ाइल के रूप में आउटपुट करता है $2। ध्यान दें कि फ़ाइल को चुपचाप -qआउटपुट के लिए कैसे किया जाता है -o -, ffmpeg पर पाइप किया जाता है और वहां इनपुट के रूप में उपयोग किया जाता है -i -

विशेष रूप से लिनक्स के नए शौक के लिए यह एक व्यावहारिक उदाहरण हो सकता है कि कमांड लाइन उपयोगी क्यों हो सकती है और जीयूआई उपकरण का उपयोग करने की तुलना में चीजों को आसान बना सकती है। मुझे यकीन नहीं है कि youtube से वीडियो डाउनलोड करने और उसकी आवाज़ को एमपी 3 में बदलने में कितना समय लगेगा। उपरोक्त रेखा कुछ सेकंड में ऐसा कर सकती है।


3
youtube-dl में केवल ऑडियो सेव करने का विकल्प है। मेरी सामान्य आज्ञा यह है, जहाँ URL stdin पर आते हैं youtube-dl --extract-audio --audio-format mp3 -a -:। अभी भी एक अच्छा उदाहरण है, लेकिन इसे करने के आसान तरीके हैं। (इसे आंतरिक रूप से ffmpeg कहते हैं।)
ब्रिगैंड

3
@FakeRainBrigand: हा, जानकर अच्छा लगा! लेकिन मुझे एक विकल्प मिला है जो इसमें नहीं बनाया जाना चाहिए: youtube-dl $1 -q -o - | mplayer -सीधे mplayer के अंदर वीडियो चलाता है। मैं वीडियो चलाने के लिए अपने सर्वर (जो टीवी से जुड़ा है) को बताने के लिए अपने लैपटॉप से ​​उस कमांड का उपयोग करता हूं। मुझे -display :0.0 -geometry 400x300+1200+200mplayer विंडो को सही स्क्रीन पर दिखाई देने देना है।
बरन

9

सामान्य उपयोग (पढ़ें: जिस तरह से मैं इसे सबसे अधिक बार उपयोग करता हूं) वह है, जब किसी कारण से, मुझे विभिन्न प्रसंस्करण कार्यों को करने के लिए कई उपकरणों के माध्यम से कुछ डेटा चलाना पड़ता है।

इसलिए मैं कहेंगे पाइप के उपयोग गोंद एक साथ कई बिल्डिंग ब्लॉक्स (विभिन्न यूनिक्स उपकरण) इकट्ठा करने के लिए के रूप में है। जैसे उलरिच ने कहा, और एक सामान्य श्लोक है।sortuniq

दर्शकों के आधार पर, यदि आप पाइप के इस उपयोग को उजागर करना चाहते हैं, तो आप उदाहरण के लिए, शुरू कर सकते हैं: "अरे, इस पाठ्यक्रम में कागजात और व्याख्यान नोट्स के साथ कई दिलचस्प पीडीएफ के लिंक हैं, लेकिन उनमें से कुछ को दोहराया जा सकता है।" किसी तरह यह स्वचालित? "

तो आप कैसे दिखा सकता है lynx --dump --listonlyलिंक की सूची हो जाता है, कैसे grepमें समाप्त होने वाले लिंक के लिए फ़िल्टर कर सकते हैं .pdf, कैसे colrmया sedसंख्या से छुटकारा मिल सकता है lynxप्रत्येक यूआरएल, कैसे करने के लिए छोड़ लिखते हैं sortऔर uniqडुप्लिकेट से छुटकारा पाने सकता है, और अंत में कैसे wget -i -पुनः प्राप्त करने के लिए किया जा सकता फ़ाइलें (का उपयोग करते हुए--wait सर्वर पर कोमल होने के लिए, निश्चित रूप से)।

मुझे डर है कि यह एक जटिल उदाहरण है। दूसरी ओर, यह पाइप की शक्ति दिखाने में मदद कर सकता है जब आप इसे पाइप करते हैं और शेल को एक ही बार में चलाते हैं।


2
आप उपयोग कर सकते हैं sort -uमें GNU coreutils भी।
टेरेसा ई जूनियर

2

मैं वास्तव में अच्छे के बारे में नहीं जानता, लेकिन इसके माध्यम से पाइपिंग grepसबसे आम उपयोगों में से एक है, संभवतः इसके बाद wc -l। (हाँ, grepअल्पज्ञात -cस्विच है।)

एक अन्य सामान्य श्लोक है | sort | uniq, यदि केवल इसलिए कि uniqइसके इनपुट को छांटना आवश्यक है।


... | sort -uयदि उपलब्ध हो तो ज्यादातर लोग पसंद करते हैं!

2

ऐसा नहीं है कि आपको इस उदाहरण के लिए इसकी आवश्यकता है, लेकिन:

$ ps aux | grep -v grep | grep conky

... greps के क्रम को उलटते हुए रंगीकरण को संरक्षित करता है, लेकिन बहुत कम कुशल है। संभवतः बड़ी सूचियों पर, रंग कोई मायने नहीं रखेगा।

यह भी, यह वेबपेज बताता है:

https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

> Johnsyweb ने 21 फरवरी को 10:31 पर उत्तर दिया
> सामान्य चाल यह है:
> ps aux | grep '[t] erminal'
> यह टर्मिनल युक्त रेखाओं से मेल खाएगा, जो '' t] erminal 'नहीं करता है!
> यह यूनिक्स के कई फ्लेवर्स पर भी काम करता है।

... लेकिन अगर आप एक अक्षर (जैसे प्रक्रिया 'X') चाह रहे हों तो यह काम नहीं करेगा।


2

मैं आखिरकार एक डेढ़ साल पहले किए गए एक ऑन्लाइनर की इस गंदगी को साझा करता हूं ...

while read in; do host "$in"; done < sites.txt | grep -iv "GOOGLE" | grep -E '1\.2\.3\.4|5\.6\.7\.8' | sed -e 's/has\ address\ 216.70.91.72//' | sed -e 's/has\ address\ 94.23.33.92//' | while read sites; do curl -sL -w "%{http_code} %{url_effective}\\n" "$sites" -o /dev/null; done | grep -ivE '4.*|5.*' | sed -e 's/200//' | sed -e 's/HTTP/http/'

यह ...

  1. साइट्स पढ़ता है
  2. प्रत्येक पर "होस्ट" चलाता है (हाइजाइट में, डिग + शॉर्ट ने इसे एक टन आसान बना दिया होगा)
  3. "GOOGLE" वाली पंक्तियों को निकालता है - ये mx रिकॉर्ड हैं
  4. उन पंक्तियों को प्राप्त करता है जिनमें दो IP होती हैं
  5. सूची में प्रत्येक साइट से http स्थिति कोड प्राप्त करता है
  6. उन साइटों को निकालता है जो 4xx या 5xx लौटाते हैं
  7. स्ट्रिप्स "200" साइटों से जो वापस लौट आए
  8. "HTTP" की जगह "HTTP" - विशुद्ध रूप से सौंदर्य, कोई वास्तविक कारण नहीं है।

यह एक एकल पायथन स्क्रिप्ट के साथ बहुत बेहतर किया जा सकता है, मुझे यकीन है।


उह ... मुझे यकीन नहीं है कि यह एक नौसिखिया को समझाने के लिए सबसे साफ और आसान उदाहरण होगा;)
एराथिल

2
मेरा प्रश्न यह है कि इसका उद्देश्य क्या है?
ADTC

मेरे पास डोमेन से भरा एक फ़ाइल था, और मुझे यह देखने की ज़रूरत थी कि क्या वे मेरे दो सर्वरों में से एक पर हैं (जो कि मुझे "विरासत में मिला", दुर्भाग्य से)। यह फ़ाइल पढ़ता है, "होस्ट" करता है और उस आउटपुट को साफ करता है, फिर यह देखने के लिए अनुरोध करता है कि क्या यह 4xx या 5xx त्रुटि देता है। यदि यह किया जाता है, तो यह डोमेन को छोड़ देगा; यदि नहीं, तो यह उन्हें आउटपुट करता है और मैंने इसे दूसरी फाइल में डाल दिया है।
टान्नर

1

यह पहली बात है जो मेरे लिए दिमाग में आई ...

mysqldumpएक सांत्वना अनुप्रयोग है जो डेटा, स्कीमा और वैकल्पिक रूप से प्रक्रियाओं और कार्यों को रोकने के लिए भेजता है। आमतौर पर यह बैकअप के लिए किसी फ़ाइल में रीडायरेक्ट हो जाता है।

mysqldump <options> > mydb.dump

यह आपको एक असम्पीडित sql स्क्रिप्ट देगा। अंतरिक्ष को बचाने के लिए, आप इसे bzip2 से संपीड़ित कर सकते हैं।

bzip2 mydb.dump

वैकल्पिक रूप से, आप दोनों एक ही चरण में कर सकते हैं:

mysqldump <options> | bzip2 > mydb.dump.bz2

ऊपर दिए गए उदाहरण में, stdout से mysqldumpbzip2 तक पाइप किया गया है, जिसके बाद इसका आउटपुट एक फ़ाइल पर रीडायरेक्ट किया गया है।


1
उलटा ऑपरेशन भी जोड़ें bzcat mydb.dump.bz2 | mysql <options>:।
मैनटवर्क

1

एक उदाहरण मैं एक कमांड में कई पाइपों के अपने काम में उपयोग करता हूं। यह MySQL सामान्य क्वेरी लॉग ($ OFILE) की खोज करने और किसी भी अस्वीकृत लॉगिन को खोजने के लिए gawk का उपयोग करता है। इसके बाद उस सूची को नाम से क्रमबद्ध किया जाता है, उस सूची को uniq को पाइप करता है जो घटनाओं को गिनता है, और फिर पाइप को क्रमबद्ध सूची को क्रमबद्ध करने के लिए एक अंतिम बार क्रमबद्ध करता है ...

gawk '{ for (x=1;x<=NF;x++) if ( $x~"Access" && $(x+4)~".*@.*") print $(x+4)}' $OFILE | sort | uniq -c | sort -n

1

पाइप फिल्टर और अनुवादक के साथ सबसे अच्छा काम करते हैं

find /usr/bin/ |                #produce 
sed 's:.*/::'  |                #translate: strip directory part
grep -i '^z'   |                #filter   : select items starting with z
xargs -d '\n' aFinalConsumer    #consume  

इस तरह, डेटा एक प्रोग्राम से अगले एक बफर तक प्रवाह कर सकता है और किसी भी बिंदु पर सभी डेटा को एक ही बार में मेमोरी में होना चाहिए।


0

cat filename | less पाइपिंग का एक भयानक उपयोग है क्योंकि आप अभी कर सकते हैं less filename

यहाँ पिप्स का एक उदाहरण है जो मैं हर दिन उपयोग करता हूं (लेकिन एक बुरा उदाहरण भी हो सकता है): ls -la | more -c

स्कॉट हॉफमैन और एनजेएसजी उत्तर बेहतर उदाहरण हैं।



0

आप जिस किसी भी निर्देशिका में चाहते हैं, उसे फ़ोल्डर आकार के लिए क्रमबद्ध विश्लेषण (फिर अंत कुंजी के साथ नीचे स्क्रॉल करें) पर निष्पादित करें:

du -m| sort -n| less

सॉर्टिअर्ट नच ऑर्डनरगॉसे


0

यहाँ एक उदाहरण है, जिसका उपयोग मैंने DISPLAY चर की स्थापना के लिए किया था जब xauth एक विकल्प नहीं था ...

export DISPLAY=\`who am i |awk '{print $NF}' | sed 's/[()]//g'`":0.0"

पहले कमांड को जरूरी डेटा मिलता है, यानी होस्टनाम या आईपी। दूसरा कमांड केवल वह डेटा (अंतिम फ़ील्ड) मिलता है। अंत में, अंतिम कमांड डेटा से कोष्ठक स्ट्रिप्स।


0

कमांड पाइपिंग आप कहीं भी उपयोग कर सकते हैं आपको लगता है कि पहले कमांड के आउटपुट को अगले इनपुट के रूप में खिलाया जा सकता है।

उदाहरण।

  1. पाठ फ़ाइलों के साथ आप पाठ की विशेष पंक्तियों को खोजने के लिए पाठ फ़ाइल को पास करने के लिए पास कर सकते हैं। फिर आप आउटपुट को sed या awk में बदल सकते हैं या लाइन के कुछ भाग को संशोधित कर सकते हैं।

बिल्ली उदाहरण txt | grep {some_line} | awk {some_command}

  1. प्रक्रिया के साथ काम आप प्रक्रिया को मारने के लिए कमांड भेजने के लिए पाइपिंग का उपयोग कर सकते हैं।

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

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