অ্যারের মধ্যে কমান্ডের আউটপুট সংরক্ষণ করুন


23

এটি হ'ল কমান্ড: pdc status -a 2>&1 | grep 'okay'এটি নিম্নলিখিত আউটপুট দেয়

[okay     ]: you are currently listening: 33
[okay     ]: you are currently listening: 22
[okay     ]: you are currently listening: 11

আমি এই কমান্ডটি শেল স্ক্রিপ্ট ফাইলটিতে লিখেছি। তবে আমি এই কমান্ডের আউটপুট অ্যারেতে প্রতিটি সূচক মানের কিছু প্রসেসিংয়ের জন্য অ্যারেতে সঞ্চয় করতে চাই।

এই কমান্ডের আউটপুট আমি অ্যারেতে কীভাবে সংরক্ষণ করব?

উত্তর:


24

আপনি যদি প্রতিটি লাইনের শেষে কেবল সংখ্যাগুলি চান:

numbers=( $(pdc ... | grep -oP 'okay.+?\K\d+$') )

আপনি যদি প্রতিটি লাইনে অ্যারেতে সঞ্চয় করতে চান

mapfile -t lines < <(pdc ...)

অ্যারেগুলি থেকে ডেটা পুনরুদ্ধার করতে:

for (( i=0; i<${#numbers[@]}; i++ )); do echo ${numbers[i]}; done
echo
printf "%s\n" "${lines[@]}"
33
22
11

[okay   ]: you are currently listening: 33
[okay   ]: you are currently listening: 22
[okay   ]: you are currently listening: 11

1
সিনট্যাক্স ত্রুটি: পুনর্নির্দেশটি অপ্রত্যাশিত, যখন আমি ব্যবহার করিmapfile -t array < <(grep.....)
সচিথ মুহানদিরাম

আপনি কি ব্যাশ বা অন্য কোনও শেল ব্যবহার করছেন?
গ্লেন জ্যাকম্যান

20

প্রথমত, আউটপুট লাইনটি আপনি যেভাবে করতে পারেন তা প্রক্রিয়া করার জন্য আপনার অ্যারির প্রয়োজন হয় না:

pdc status -a 2>&1 | grep 'okay' | while read line; do somecommand "$line"; done

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

#!/bin/bash
IFS=$'\n'
array=($(pdc status -a 2>&1 | grep 'okay'))

ব্যাখ্যা:

  • $IFS=$'\n': $IFSবাশের ইনপুট ফিল্ড বিভাজক , এটি কেবলমাত্র নতুন লাইন অক্ষরে সেট করা ( \n) নিশ্চিত করে যে আপনার আউটপুট লাইনগুলি হোয়াইটস্পেসে বিভক্ত হবে না যাতে আপনি প্রতিটি লাইনকে পৃথক অ্যারে উপাদান হিসাবে সংরক্ষণ করতে পারেন। এটি ছাড়া আপনার কমান্ডের প্রতিটি শব্দ আলাদা আলাদা উপাদান হতে পারে।

    আপনি যা করতে চান তার উপর নির্ভর করে $IFSঅ্যারের পড়ার পরে এটির পুরানো মানটি সংরক্ষণ এবং পুনরুদ্ধার করা ভাল ধারণা হতে পারে :

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
    
  • $(command): এটিকে কমান্ড সাবস্টিটিউশন বলা হয় এবং আপনাকে ভেরিয়েবলের একটি কমান্ডের আউটপুট সংরক্ষণ করতে দেয়। এটি করার দুটি উপায় রয়েছে:

    var=$(command)

    এবং

    var=`command`

    দুজনের মধ্যে, $()ভাল কারণ:

    • এটি নেস্টেড কমান্ডগুলি মোকাবেলা করতে পারে:

      var=$(command1 $(command 2))

      উদাহরণ স্বরূপ var=$(cat $(find ~/))

    • এটিতে উদ্ধৃতি এবং ক্লিনার সিনট্যাক্সের ফলাফলের সাথে খুব কম সমস্যা রয়েছে। আরও জন্য এখানে দেখুন।


6

readarrayবিল্টিন ব্যবহার করে আরও একটি স্বজ্ঞাত উপায় (দেখুন help -m readarray):

readarray -t array <<< "$(pdc status -a 2>&1 | grep 'okay')"

এর পরে, একটি অ্যারের উপাদান মুদ্রণ করতে, দ্বিতীয় উপাদানটি বলতে দিন, আপনি ব্যবহার করতে পারেন:

echo "${array[1]}"

পৃথক লাইনে সমস্ত অ্যারে উপাদানগুলি মুদ্রণ করতে আপনি ব্যবহার করতে পারেন:

printf -- "%s\n" "${array[@]}"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.