কমান্ড লাইন: আউটপুট থেকে সাবস্ট্রিং নিষ্কাশন


25

বলুন আমি কমান্ড সাইস্টফ চালাচ্ছি

$ SayStuff

এবং আউটপুট হয়

Watermelons and cucumbers

এখন। বলুন আমি cucumbersআউটপুট থেকে সাবস্ট্রিংটি বের করতে এবং এটিকে কিছুতে পাইপ করতে চাই।
আমি এই প্রোগ্রামটিমে যেভাবে যাব তা হ'ল ডিলিমিটার স্পেস দ্বারা আউটপুটটিকে একটি অ্যারেতে বিভক্ত করা এবং এটি দ্বারা রেফারেন্স করা ArrayName[2]। আমি শেল স্ক্রিপ্টগুলিতে মোটামুটি নতুন এবং কেবলমাত্র আধা-ক্রিপ্টিক cutউদাহরণগুলি খনন করতে পেরেছি , যার কোনোটাই বোঝা যায়নি।

কোন ধারনা?

উত্তর:


30
$ 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
জিতরেক্স

13

আমি ইতিমধ্যে @ এসএলএইচএইচসি দ্বারা প্রদত্ত বিকল্পগুলির মধ্যে একটি ব্যবহার করব তবে এটি করার আরও কয়েকটি উপায় এখানে রয়েছে:

  1. আপনি অন্য কোনও ভাষায় যেমন অ্যারে ব্যবহার করছেন:

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

    var=()একটি অ্যারের ঘোষণা, $(command)কমান্ডের আউটপুট সংরক্ষণ করে। সুতরাং, foo=( $(SayStuff) )আউটপুট SayStuffঅ্যারের মধ্যে রাখে fooএবং আপনি echoএটির পরে তৃতীয় উপাদান ${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প্রতিটি একটি newline যোগ করার জন্য Perl বলে printবিবৃতি -nএটি লাইন দ্বারা stdin লাইন প্রক্রিয়া উচিত এবং -eএটা স্ক্রিপ্ট কমান্ড লাইন দেওয়া চালানো উচিত যে।

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

    বিকল্পগুলি উপরে বর্ণিত হয়েছিল, আমরা কেবল সর্বশেষ স্থান এবং মুদ্রণ ( -p) মুছে ফেলা পর্যন্ত সবকিছু মুছে ফেলছি ।

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

    এখানে আমরা Watermelons and cucumbersআর্গুমেন্ট হিসাবে পাস করছি , যা পার্ল @ARGঅ্যারেতে সংরক্ষণ করবে এবং তাই, আমরা এর শেষ উপাদানটি মুদ্রণ করি @ARG

  6. কপট। এই একটি sedস্পেসগুলি নতুন tailলাইনে রূপান্তর করতে এবং তারপরে কেবল শেষ লাইনটি মুদ্রণ করতে ব্যবহার করে ।

    $ SayStuff | sed 's/ /\n/g' | tail -n 1
    cucumbers
  7. গ্রেপ এবং নিয়মিত প্রকাশ, -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

সুতরাং আপনার যদি তৃতীয় ক্ষেত্রের প্রয়োজন হয় এবং এটি স্পেসগুলি দ্বারা সীমিত করা হয় 'তবে তা is

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

আপনি যদি সর্বশেষ ক্ষেত্রটি চান তবে আপনার সম্ভবত বিশ্রী ব্যবহার করা উচিত ।
এই ক্ষেত্রে এটি হয়ে যায়:

$ প্রতিধ্বনি "তরমুজ এবং শসা" | awk '{মুদ্রণ $ NF}'
শসা

ইন awkএন এফ রেখাতে ক্ষেত্রগুলির সংখ্যা তাই $NFলাইনে গত ক্ষেত্র মানে।


মূলত একই প্রশ্নটি এখানে তবে আরও সাধারণীকরণ করা হয়েছে: stackoverflow.com/questions/3162385/… হ্যাঁ আপনি অন্য উপায়গুলি ব্যবহার করতে পারেন তবে
অবাস্ততম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.