Memorizza l'output del comando nell'array

21

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 di script della shell. Ma voglio archiviare l'output di questo comando nell'array per qualche elaborazione su ciascun valore dell'indice nell'array.

Come posso archiviare l'output di questo comando nell'array?

    
posta Prakash V Holkar 25.03.2014 - 16:14

3 risposte

22

Se vuoi solo i numeri alla fine di ogni riga:

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

Se vuoi memorizzare ogni riga nell'array

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

Per recuperare i dati dagli array:

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
    
risposta data glenn jackman 25.03.2014 - 16:36
19

Prima di tutto, non hai necessariamente bisogno dell'array, per elaborare l'output linea per linea che puoi fare:

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 è separatore di campo di immissione di bash, impostandolo sul Solo carattere di fine riga ( \n ) garantisce che le righe di output non vengano divise su spazi vuoti in modo da poter salvare ogni riga come elemento di array separato. Senza questo, ogni parola dell'output del tuo comando sarebbe un elemento diverso.

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

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
    
  • $(command) : si chiama sostituzione comandi 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, $() è migliore perché:

    • Può gestire i comandi annidati:

      var=$(command1 $(command 2))
      

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

    • Ha un numero molto minore di citazioni e produce una sintassi più pulita. Vedi qui per ulteriori informazioni.

risposta data terdon 25.03.2014 - 16:37
5

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

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

Quindi, per stampare un elemento di una matrice, diciamo un secondo elemento, puoi usare:

echo "${array[1]}"

Per stampare tutti gli elementi dell'array su linee separate, puoi usare:

printf -- "%s\n" "${array[@]}"
    
risposta data Radu Rădeanu 25.03.2014 - 19:00

Leggi altre domande sui tag