У меня есть сценарий удара, который будет:
Сценарий 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 того, чтобы быть перезаписанным при размещении в переменную?
Используйте современный синтаксис замены процесса 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+' )
Примечание: Я заменил Ваши исходные имена переменной более короткими так, чтобы команды приятно поместились в одну строку.