Speichern Sie die Ausgabe des Befehls im Array

23

Dies ist der Befehl: pdc status -a 2>&1 | grep 'okay'Er gibt die folgende Ausgabe aus

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

Ich habe diesen Befehl in Shell-Scrip-Datei geschrieben. Aber ich möchte die Ausgabe dieses Befehls in das Array speichern, damit sie für jeden Indexwert im Array verarbeitet werden kann.

Wie kann ich die Ausgabe dieses Befehls im Array speichern?

Prakash V Holkar
quelle

Antworten:

24

Wenn Sie nur die Zahlen am Ende jeder Zeile wollen:

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

Wenn Sie jede Zeile im Array speichern möchten

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

So rufen Sie die Daten von den Arrays ab:

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
Glenn Jackman
quelle
1
Syntaxfehler: Umleitung unerwartet, wenn ich verwendemapfile -t array < <(grep.....)
Sachith Muhandiram
Verwenden Sie Bash oder eine andere Shell?
Glenn Jackman
20

Zunächst benötigen Sie nicht unbedingt das Array, um die Ausgabe zeilenweise zu verarbeiten.

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

Wenn Sie das Array tun müssen, Glenn Jackman gab bereits Ihnen den besten Weg , es zu tun , aber hier ist ein anderer Ansatz:

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

Erläuterung:

  • $IFS=$'\n': $IFSist das Eingabefeld-Trennzeichen der Bash , wenn es nur auf das Zeilenumbruch-Zeichen ( \n) gesetzt wird, wird sichergestellt, dass Ihre Ausgabezeilen nicht durch Leerzeichen getrennt werden, sodass Sie jede Zeile als separates Array-Element speichern können. Ohne dies wäre jedes Wort der Ausgabe Ihres Befehls ein anderes Element.

    Je nachdem, was Sie tun möchten, ist es möglicherweise eine gute Idee, den alten Wert von zu speichern $IFSund wiederherzustellen, nachdem das Array gelesen wurde:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Dies wird als Befehlsersetzung bezeichnet und ermöglicht es Ihnen, die Ausgabe eines Befehls in einer Variablen zu speichern. Dafür gibt es zwei Möglichkeiten:

    var=$(command)

    und

    var=`command`

    Von den beiden ist das $()besser, weil:

    • Es kann mit verschachtelten Befehlen umgehen:

      var=$(command1 $(command 2))

      Beispielsweise var=$(cat $(find ~/))

    • Es hat weitaus weniger Probleme mit Zitaten und führt zu einer saubereren Syntax. Sehen Sie hier für mehr.

terdon
quelle
6

Noch eine intuitivere Methode zur Verwendung von readarraybuiltin (siehe help -m readarray):

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

Als Nächstes können Sie zum Drucken eines Array-Elements, beispielsweise eines zweiten Elements, Folgendes verwenden:

echo "${array[1]}"

Um alle Array-Elemente in separaten Zeilen zu drucken, können Sie Folgendes verwenden:

printf -- "%s\n" "${array[@]}"
Radu Rădeanu
quelle