Armazena a saída do comando na matriz

21

Este é o comando: pdc status -a 2>&1 | grep 'okay' Dá a seguinte saída

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

Eu escrevi este comando no arquivo shell script. Mas eu quero armazenar a saída desse comando na matriz para algum processamento em cada valor de índice na matriz.

Como posso armazenar a saída desse comando na matriz?

    
por Prakash V Holkar 25.03.2014 / 16:14

3 respostas

22

Se você quiser apenas os números no final de cada linha:

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

Se você quiser armazenar cada linha na matriz

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

Para recuperar os dados das matrizes:

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
    
por glenn jackman 25.03.2014 / 16:36
19

Primeiro de tudo, você não precisa necessariamente da matriz, para processar a saída linha a linha que você pode fazer:

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

Se você precisa da matriz, Glenn Jackman já deu a melhor maneira de fazer isso, mas aqui está outra abordagem:

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

Explicação:

  • $IFS=$'\n' : $IFS é o separador de campos de entrada do bash, configurando-o como apenas o caractere de nova linha ( \n ) garante que suas linhas de saída não sejam divididas em espaço em branco, para que você possa salvar cada linha como um elemento de matriz separado. Sem isso, cada palavra da saída do seu comando seria um elemento diferente.

    Dependendo do que você deseja fazer, pode ser uma boa ideia salvar o valor antigo de $IFS e restaurá-lo depois que a matriz for lida:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
    
  • $(command) : Isso é chamado de substituição de comando e permite que você salve a saída de um comando em uma variável. Existem duas maneiras de fazer isso:

    var=$(command)
    

    e

    var='command'
    

    Dos dois, o $() é melhor porque:

    • Ele pode lidar com comandos aninhados:

      var=$(command1 $(command 2))
      

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

    • Tem muito menos problemas com citações e resulta em uma sintaxe mais clara. Consulte aqui para saber mais.

por terdon 25.03.2014 / 16:37
5

Ainda outra forma mais intuitiva usando readarray builtin (veja help -m readarray ):

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

Em seguida, para imprimir um elemento da matriz, digamos o segundo elemento, você pode usar:

echo "${array[1]}"

Para imprimir todos os elementos da matriz em linhas separadas, você pode usar:

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

Tags