При размещении результатов awk операции в переменную перезаписываются мои результаты

У меня есть сценарий удара, который будет:

  1. Назовите сценарий Python названным get-server-status.py
  2. Передайте эти результаты по каналу в команду awk, которая получит фиксацию-sha от этого вывода
  3. Поместите конечный результат в переменную под названием "СЕРВЕРЫ"

Сценарий Python, который называет мой сценарий удара, возвращает следующее:

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

Я хочу получить только символы после 'фиксации-sha', таким образом, я передаю это по каналу в awk со следующим кодом:

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

Это возвращает то, что я хочу:

0123456789

Точно так же, если мой сценарий Python находит два сервера и запрашивает два экземпляра...:

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

Я добираюсь два, фиксируют shas. Так же, как я хотел:

0123456789   
0123456789

Но вот то, где это идет не так, как надо. Если я пытаюсь поместить эти результаты в переменную, т.е.:

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

Это только возвратит одно значение вместо два.

0123456789

Что происходит здесь? Состоит в том первый возврат awk того, чтобы быть перезаписанным при размещении в переменную?

1
задан 13 September 2017 в 17:40

1 ответ

Используйте современный синтаксис замены процесса Bash $( ... ) или старая замена процесса только с обратными галочками ` ... `:

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

С чем Вы записали (` ... `) выполняет код в обратных галочках и затем создает список/массив (это - то, что круглые скобки делают) от его слов. Если Вы затем попытаетесь считать переменную типа массив как нормальная, то Вы только вернете первый элемент массива. Для получения других необходимо было бы указать индекс.

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

Я также сказал бы это в этом варианте использования, grep с оглядыванием, вероятно, более простое решение, хотя Ваша попытка с awk кажется, корректен также. Это - главным образом вопрос вкуса, который я предполагаю, но вот то, что я записал бы вместо этого:

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

Примечание: Я заменил Ваши исходные имена переменной более короткими так, чтобы команды приятно поместились в одну строку.

0
ответ дан 8 December 2019 в 04:03

Другие вопросы по тегам:

Похожие вопросы: