Memorizza l'output del comando nella matrice


23

Questo è il comando: pdc status -a 2>&1 | grep 'okay'fornisce il seguente output

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

Ho scritto questo comando nel file script shell. Ma voglio archiviare l'output di questo comando nella matrice per alcune elaborazioni su ciascuno dei valori dell'indice nella matrice.

Come posso archiviare l'output di questo comando nella matrice?

Risposte:


24

Se vuoi solo i numeri alla fine di ogni riga:

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

Se si desidera memorizzare ogni riga nell'array

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

Per recuperare i dati dalle matrici:

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
Errore di sintassi: reindirizzamento imprevisto, quando usomapfile -t array < <(grep.....)
Sachith Muhandiram,

Stai usando bash o qualche altra shell?
Glenn Jackman,

20

Prima di tutto, non è necessario necessariamente l'array, per elaborare l'output riga per riga è possibile eseguire:

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

Se hai bisogno dell'array, Glenn Jackman ti ha già fornito il modo migliore per farlo, ma ecco un altro approccio:

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

Spiegazione:

  • $IFS=$'\n': $IFSè il separatore del campo di input di bash , impostandolo solo sul carattere di nuova riga ( \n) garantisce che le linee di output non vengano divise su spazi bianchi in modo da poter salvare ciascuna riga come elemento array separato. Senza questo, ogni parola dell'output del tuo comando sarebbe un elemento diverso.

    A seconda di cosa si desidera fare, potrebbe essere una buona idea salvare il vecchio valore $IFSe ripristinarlo dopo la lettura dell'array:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Si chiama sostituzione di comando e consente di salvare l'output di un comando in una variabile. Ci sono due modi per farlo:

    var=$(command)

    e

    var=`command`

    Dei due, $()è meglio perché:

    • Può gestire i comandi nidificati:

      var=$(command1 $(command 2))

      Per esempio var=$(cat $(find ~/))

    • Ha molti meno problemi con le quotazioni e si traduce in una sintassi più pulita. Vedi qui per di più.


6

Ancora un altro modo più intuitivo usando readarraybuiltin (vedi help -m readarray):

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

Quindi, per stampare un elemento array, diciamo secondo elemento, è possibile utilizzare:

echo "${array[1]}"

Per stampare tutti gli elementi dell'array su righe separate, è possibile utilizzare:

printf -- "%s\n" "${array[@]}"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.