Ao colocar os resultados de uma operação awk em uma variável, meus resultados estão sendo sobrescritos

1

Eu tenho um script bash que irá:

  1. Chame um script python chamado get-server-status.py
  2. Canalize esses resultados em um comando awk que obterá um commit-sha dessa saída
  3. Coloque o resultado final em uma variável chamada "SERVERS"

O script python chamado pelo meu script bash retorna o seguinte:

2017-09-13 14:09:15 INFO: About to query Instance:i-01010abcde54345a4 
i-01010abcde54345a4 - 10.0.1.216: commit-sha = 0123456789

Eu gostaria de obter apenas os caracteres depois de 'commit-sha', então canalizo isso para o awk com o seguinte código:

GET_SERVER_STATUS="./get-server-status.py --field=commit-sha -a"
$GET_SERVER_STATUS $SERVER_ASG_NAME | awk -F "commit-sha = " '{ print $2 }

Isso retorna o que eu quero:

0123456789

Da mesma forma, se meu script python encontrar dois servidores e consultar duas instâncias ...:

2017-09-13 14:09:15 INFO: About to query Instance:i-01010abcde54345a4 
i-01010abcde54345a4 - 10.0.1.216: commit-sha = 0123456789
2017-09-13 14:09:15 INFO: About to query Instance:i-03949eifje34543g3 
i-03949eifje34543g3 - 10.0.2.246: commit-sha = 0123456789

Eu recebo dois commit shas. Assim como eu queria:

0123456789   
0123456789

Mas aqui é onde isso dá errado. Se eu tentar colocar esses resultados em uma variável, por exemplo:

SERVERS=('$GET_SERVER_STATUS $SERVER_ASG_NAME | awk -F "commit-sha = " '{ print $2 }'')

Ele retornará apenas um valor em vez de dois.

0123456789

O que está acontecendo aqui? O primeiro retorno do awk é sobrescrito quando colocado em uma variável?

    
por Xenidious 13.09.2017 / 16:40

1 resposta

0

Use a sintaxe de substituição de processo moderna do Bash $( ... ) ou a substituição do processo antigo somente com backticks ' ... ' :

SERVERS=$( $COMMAND $ARGUMENTS | awk -F "commit-sha = " '{ print $2 }' )

O que você escreveu com (' ... ') executa o código dentro dos backticks e então cria uma lista / array (é o que os parênteses fazem) de suas palavras. Se você tentar ler a variável array como uma normal, você só terá o primeiro elemento array de volta. Para obter os outros, você teria que especificar um índice.

$ text=(few words in here)
$ echo $text
few
$ echo ${text[1]}
words

Eu também diria que, nesse caso de uso, grep com uma visão geral provavelmente é uma solução mais direta, embora sua tentativa com awk também esteja correta. É principalmente uma questão de gosto, eu acho, mas aqui está o que eu escreveria:

SERVERS=$( $COMMAND $ARGUMENTS | grep -Po '(?<=commit-sha = )\w+' )

Nota: eu substituí os nomes das variáveis originais por nomes mais curtos para que os comandos se ajustassem bem em uma linha.

    
por Byte Commander 13.09.2017 / 17:35