कमांड लाइन: आउटपुट से विकल्प निकालें


26

कहते हैं कि मैं कमांड SayStuff चलाते हैं

$ SayStuff

और आउटपुट है

Watermelons and cucumbers

अभी। कहते हैं कि मैं cucumbersआउटपुट से सबस्ट्रिंग को निकालना चाहता हूं और इसे किसी चीज में पाइप करना चाहता हूं ।
जिस तरह से मैं इस कार्यक्रम के बारे में जाना जाएगा वह सीमांत अंतरिक्ष द्वारा एक सरणी में आउटपुट को विभाजित करने और इसे संदर्भ देने के लिए होगा ArrayName[2]। मैं शेल स्क्रिप्ट के लिए काफी नया हूं और केवल अर्ध-गूढ़ cutउदाहरणों को खोदने में सफल रहा हूं , जिनमें से कोई भी अर्थ नहीं था।

कोई विचार?

जवाबों:


31
$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3
cucumbers

-d ' 'बताता है cutरिक्त स्थान पर विभाजित करने के लिए। -f 3तीसरे कॉलम का चयन करता है।

तुम भी उपयोग कर सकते हैं awk, जो पहले से ही अंतरिक्ष के आधार पर बंटवारे करता है और स्तंभों के रूप में उपलब्ध हो जाता है $1, $2...

$ echo "Watermelons and cucumbers" | awk '{ print $3 }'
cucumbers

ध्यान दें कि cutकरते समय एक चर संख्या नहीं होगी awk
Zitrax

14

मैं शायद पहले से ही दिए गए विकल्पों में से एक का उपयोग करूंगा @slhck लेकिन यहाँ ऐसा करने के कुछ और तरीके दिए गए हैं:

  1. सरणियों का उपयोग करना, जैसा कि आप किसी अन्य भाषा में करेंगे:

    $ foo=( $(SayStuff) ) 
    $ echo ${foo[2]}
    cucumbers

    var=()एक सरणी वाणी, $(command)आदेश के उत्पादन में बचत होती है। इसलिए, सरणी और युओ foo=( $(SayStuff) )के उत्पादन को संग्रहीत करता है और फिर इसके साथ तीसरा तत्व है ।SayStufffooecho${foo[2]}

  2. sed

    $ SayStuff | sed 's/.* \(.*\)/\1/'
    cucumbers

    sedआदेश विकल्प होगा ( s///पिछले शब्द के साथ) सब कुछ। रेगेक्स एक स्पेस ( .*) तक कुछ भी मैच करता है जो आखिरी स्पेस तक सब कुछ मैच करेगा और फिर आखिरी शब्द कैप्चर करेगा (\(.*\)। चूंकि शब्द कैप्चर किया गया है, इसलिए हम इसे संदर्भित कर सकते हैं \1

    एक सरल संस्करण:

    $ SayStuff | sed 's/.* //'
    cucumbers
  3. दे घुमा के

    $ foo=$(SayStuff); echo ${foo##* } 
    cucumbers

    यह बैश की स्ट्रिंग हेरफेर क्षमताओं का उपयोग करता है, अधिक विवरण के लिए यहां देखें।

  4. अधिक मारपीट

    $ SayStuff | while read a b c; do echo $c; done
    cucumbers
  5. पर्ल, जहां निश्चित रूप से, ऐसा करने के कई तरीके हैं:

    $ SayStuff | perl -lane 'print $F[$#F]'
    cucumber

    -aबनाता है perlकी तरह व्यवहार awkकरने से व्हाइटस्पेस पर, बंटवारे लाइनों और सरणी में बचत @F। हम तब @F( $#Fतत्वों की संख्या में @F) के अंतिम तत्व को प्रिंट करते हैं । -lप्रत्येक के लिए एक नई पंक्ति जोड़ने के लिए पर्ल बताता printबयान, -nकि यह लाइन द्वारा STDIN लाइन संसाधित करना चाहिए और -eयह स्क्रिप्ट कमांड लाइन पर दिया चलाना चाहिए कि।

    $ SayStuff | perl -pe 's/.* //'
    cucumber

    ऊपर दिए गए विकल्पों के बारे में बताया गया था, हम आखिरी जगह और छपाई ( -p) तक सब कुछ हटा रहे हैं ।

    $ perl -le 'print $ARGV[$#ARGV]' $(SayStuff)
    cucumbers

    यहां हम Watermelons and cucumbersतर्क के रूप में गुजर रहे हैं , जो पर्ल @ARGसरणी में बचाएगा और इसलिए, हम अंतिम तत्व को प्रिंट करते हैं @ARG

  6. प्रवंचना। यह एक sedरिक्त स्थान को newlines में बदलने और फिर tailकेवल अंतिम पंक्ति को प्रिंट करने के लिए उपयोग करता है ।

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
  7. grep और रेगुलर एक्सप्रेशन, -oजिसके इस्तेमाल से केवल मैचिंग स्ट्रिंग प्रिंट होता है।

    $ SayStuff | grep -Po '\w+$' 
    cucumbers
  8. धोखा दे

    $ SayStuff | grep -o cucumbers
    cucumbers

2

यहाँ कुछ और स्पष्टीकरण दिया गया है:

Usage: cut OPTION... [FILE]...

Print selected parts of lines from each FILE to standard output.

   -d, --delimiter=DELIM
          use DELIM instead of TAB for field delimiter

   -f, --fields=LIST
          select only these fields;  also print any line that contains  no
          delimiter character, unless the -s option is specified

इसलिए यदि आपको तीसरे क्षेत्र की आवश्यकता है और इसे रिक्त स्थान '' द्वारा सीमांकित किया गया है तो यह है

$ echo "Watermelons and cucumbers" | cut -d ' ' -f 3  
cucumbers

यदि आप चाहते हैं कि LAST फ़ील्ड आपको awk का उपयोग करना चाहिए ।
इस मामले में यह बन जाता है:

$ गूंज "तरबूज और खीरे" | awk '{प्रिंट $ NF}'
खीरे

में awkएनएफ लाइन में फ़ील्ड की संख्या है, तो $NFलाइन में पिछले क्षेत्र का मतलब है।


मूल रूप से एक ही सवाल यहाँ है, लेकिन अधिक सामान्यीकृत है: stackoverflow.com/questions/3162385/… हाँ आप अन्य तरीकों का उपयोग कर सकते हैं लेकिन awk सबसे छोटा है
zeridon
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.