Armazena a saída do comando na matriz


23

Este é o comando: pdc status -a 2>&1 | grep 'okay'Ele fornece 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 de script de shell. Mas eu quero armazenar a saída deste comando na matriz para algum processamento em cada um dos valores de índice na matriz.

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

Respostas:


24

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

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

Se você deseja 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

1
Erro de sintaxe: redirecionamento inesperado, quando eu usomapfile -t array < <(grep.....)
Sachith Muhandiram

Você está usando o bash ou algum outro shell?
Glenn Jackman

20

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

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

Se você precisa da matriz, Glenn Jackman já lhe 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 , defini-lo apenas como 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 idéia salvar o valor antigo $IFSe restaurá-lo após a leitura da matriz:

    oldifs="$IFS"
    IFS=$'\n'
    array=($(echo -e "foo bar\nbaz bar"))
    IFS="$oldifs"
  • $(command): Isso é chamado substituição de comando e permite salvar a saída de um comando em uma variável. Há 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 ~/))

    • Ele tem muito menos problemas com citações e resulta em uma sintaxe mais limpa. Veja aqui para mais.


6

Mais uma maneira mais intuitiva de usar o readarraybuiltin (consulte 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[@]}"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.