JMESPath извлекает необработанные значения из списка

Я пытаюсь написать сценарий с помощью Azure CLI. Скажите, что мой запрос возвращает следующее:

[
  "a",
  "b",
  "c"
]

Я хочу использовать эти значения в цикле bash. Намного приятнее было бы получить их в таком виде:

a
b
c

Есть ли способ сделать это, в идеале, с примитивами запросов JMESPath? В противном случае мне придется использовать команды bash, что оставляет желать лучшего от JMESPath.


person s g    schedule 02.04.2019    source источник


Ответы (2)


Кажется, вы могли бы использовать --out tsv,

Например, az vm list --out tsv | grep RGD | cut -f8

KBDemo001VM
KBDemo020

Подробнее см. https://docs.microsoft.com/en-us/cli/azure/format-output-azure-cli?view=azure-cli-latest#tsv-output-format

person Nancy Xiong    schedule 03.04.2019

У меня не было большого успеха с JMESPath для запроса вывода. Но я обнаружил, что с помощью jq немного проще анализировать возвращаемый json.

Например, мне нужно добавить внутренние конечные точки службы во все подсети в конкретной виртуальной сети. Я передам вывод json в массив bash, и с помощью цикла for вы можете выполнять команды, используя пары значений ключа json.

update_subnet() {
subnet_service_endpoints="Microsoft.EventHub Microsoft.KeyVault Microsoft.ServiceBus Microsoft.Storage"

subnet_json=$(az network vnet subnet list --subscription ${subscription_name} --resource-group ${resource_group} --vnet-name ${virtual_network} --output json)

readarray -t SUBARR < <(echo ${subnet_json} | jq -c '.[]')

for SUBNET in "${SUBARR[@]}"
do
  SUBNET_NAME=$(echo "${SUBNET}" | jq -r .name)
  ADDRESS_PREFIX=$(echo "${SUBNET}" | jq -r .addressPrefix)
  RESOURCE_GROUP=$(echo "${SUBNET}" | jq -r .resourceGroup)

  RESULT=$(az network vnet subnet update --subscription ${subscription_name} --resource-group ${resource_group} --vnet-name ${virtual_network} --name ${SUBNET_NAME} --address-prefixes ${ADDRESS_PREFIX} --service-endpoints ${subnet_service_endpoints})

  if [ "$RESULT"  == "" ]
  then
    echo "Something happened and unable to parse command"
  else
    echo "${RESULT}"
  fi
done

}
person Michael Dupuis    schedule 05.04.2019
comment
Я определенно считаю jq лучше. К сожалению, поскольку инструменты az имеют встроенный jmespath, часто предпочтительнее не добавлять новый инструмент, если это не является абсолютно необходимым. - person s g; 05.04.2019