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

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

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

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

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

Я хочу получить только символы после 'commit- 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

Я получаю две фиксации. Так же, как я хотел:

0123456789 0123456789

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

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

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

0123456789

Что здесь происходит? Является ли первое возвращение awk переписанным, когда оно помещено в переменную?

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

3 ответа

Использовать синтаксис замещения текущего процесса 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+' )

Примечание. Я заменил ваши исходные имена переменных более короткими, чтобы команды хорошо вписывались в одну строку. [ ! d4]

0
ответ дан 22 May 2018 в 18:30

Использовать синтаксис замещения текущего процесса 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+' )

Примечание. Я заменил ваши исходные имена переменных более короткими, чтобы команды хорошо вписывались в одну строку. [ ! d4]

0
ответ дан 18 July 2018 в 06:55

Использовать синтаксис замещения текущего процесса 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+' )

Примечание. Я заменил ваши исходные имена переменных более короткими, чтобы команды хорошо вписывались в одну строку. [ ! d4]

0
ответ дан 24 July 2018 в 18:42

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

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