Almacenar la salida del comando en la matriz

21

Este es el comando: pdc status -a 2>&1 | grep 'okay' Da el siguiente resultado

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

He escrito este comando en el archivo scrip de shell. Pero quiero almacenar la salida de este comando en la matriz para algún procesamiento en cada uno de los valores de índice en la matriz.

¿Cómo puedo almacenar la salida de este comando en la matriz?

    
pregunta Prakash V Holkar 25.03.2014 - 15:14

3 respuestas

22

Si solo quiere los números al final de cada línea:

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

Si desea almacenar cada línea en la matriz

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

Para recuperar los datos de las matrices:

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
    
respondido por el glenn jackman 25.03.2014 - 15:36
19

En primer lugar, no necesita necesariamente la matriz, para procesar la línea de salida por línea que puede hacer:

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

Si necesita la matriz, Glenn Jackman ya le dio la mejor manera de hacerlo, pero este es otro enfoque:

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

Explicación:

  • $IFS=$'\n' : $IFS es el separador del campo de entrada de bash , configurándolo en El carácter de nueva línea solamente ( \n ) asegura que sus líneas de salida no se dividirán en espacios en blanco para que pueda guardar cada línea como un elemento de matriz por separado. Sin esto, cada palabra de la salida de su comando sería un elemento diferente.

    Dependiendo de lo que quieras hacer, puede ser una buena idea guardar el valor anterior de $IFS y restaurarlo después de que se lea la matriz:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
    
  • $(command) : esto se llama sustitución de comando y le permite guardar el resultado de un comando en una variable. Hay dos formas de hacer esto:

    var=$(command)
    

    y

    var='command'
    

    De los dos, el $() es mejor porque:

    • Puede tratar con comandos anidados:

      var=$(command1 $(command 2))
      

      Por ejemplo, var=$(cat $(find ~/))

    • Tiene muchos menos problemas para citar y da como resultado una sintaxis más limpia. Consulte aquí para obtener más información.

respondido por el terdon 25.03.2014 - 15:37
5

Otra forma más intuitiva de usar readarray incorporado (ver help -m readarray ):

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

Luego, para imprimir un elemento de matriz, digamos segundo elemento, puede usar:

echo "${array[1]}"

Para imprimir todos los elementos de la matriz en líneas separadas, puede usar:

printf -- "%s\n" "${array[@]}"
    
respondido por el Radu Rădeanu 25.03.2014 - 18:00

Lea otras preguntas en las etiquetas