सरणी में कमांड का स्टोर आउटपुट


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बैश का है इनपुट फील्ड सेपरेटर है , इसे केवल newline वर्ण पर सेट \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[@]}"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.