Almacenar la salida del comando en la matriz


23

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 un procesamiento en cada uno de los valores de índice en la matriz.

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

Respuestas:


24

Si solo desea 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

1
Error de sintaxis: redirección inesperada, cuando usomapfile -t array < <(grep.....)
Sachith Muhandiram

¿Estás usando bash o algún otro shell?
Glenn Jackman

20

En primer lugar, no necesariamente necesita la matriz, para procesar la salida línea por línea 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 aquí hay otro enfoque:

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

Explicación:

  • $IFS=$'\n': $IFSes el separador de campo de entrada de bash , configurándolo solo con el carácter de nueva línea ( \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 separado. Sin esto, cada palabra de la salida de su comando sería un elemento diferente.

    Dependiendo de lo que desee hacer, puede ser una buena idea guardar el valor anterior $IFSy restaurarlo después de leer 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 la salida 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 con las citas y da como resultado una sintaxis más limpia. Mira aquí para más.


6

Otra forma más intuitiva de usar readarraybuiltin (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[@]}"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.