Combina múltiplas saídas do grep em uma variável

4

Basicamente, tenho abaixo o cenário, por exemplo,

  1. grep 'test: \K(\d+)' $file = > 15
  2. grep 'test1: \K(\d+)' $file = > 20

Existe alguma maneira de armazenar o resultado de ambos os comandos em uma variável como com vírgula como separador,

Test="grep 'test: \K(\d+)' $file;grep 'test1: \K(\d+)' $file"

Resposta = eval $Test

Resultado esperado: 15,20 ?

    
por Rocky86 24.01.2017 / 08:49

2 respostas

8

Sim, você pode fazer isso usando Substituição de comandos :

Test="$(grep 'test: \K(\d+)' $file),$(grep 'test1: \K(\d+)' $file)"

A variável = $(..) chamada Substituição de comando e significa nada mais que executar um comando shell e armazenar sua saída em uma variável ou exibir novamente usando o comando echo . Por exemplo, exibir data e hora:

echo "Today is $(date)"

e para armazená-lo em uma variável:

SERVERNAME="$(hostname)"

você pode concatenar para a saída:

echo "$(hostname),$(date)"

o resultado será:

yourhostname,Tue Jan 24 09:56:32 EET 2017
    
por 24.01.2017 / 08:53
0

Para colocar a saída de um comando em uma variável, use substituição de comando , exatamente para isso. Usar eval não pode ajudar (mesmo se você o estivesse usando corretamente, que você não é ).

Test="$(grep 'test: \K(\d+)' "$file"; grep 'test1: \K(\d+)' "$file")"

A saída é dois números (assumindo que cada um dos padrões corresponde exatamente uma vez) separados por uma nova linha. A razão pela qual eles são separados por uma nova linha é que o grep gera linhas (como qualquer outra ferramenta), e uma linha sempre termina com um caractere de nova linha. O primeiro grep imprime 15 com uma nova linha no final, o segundo grep imprime 20 com uma nova linha no final e, em seguida, a substituição de comando retira a (s) nova (s) linha (s) no final. Se você quiser uma vírgula como separador, use duas substituições de comando e inclua a vírgula entre:

Test="$(grep 'test: \K(\d+)' "$file"),$(grep 'test1: \K(\d+)' "$file")"
    
por 25.01.2017 / 02:22