JMESPath从列表中提取原始值

时间:2019-04-02 23:49:03

标签: azure-cli jmespath

我正在尝试使用Azure CLI进行一些脚本编写。假设我的查询返回以下内容:

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

我想在bash循环中使用这些值。以以下形式获得它们会更好:

a
b
c

理想情况下,有没有一种方法可以使用JMESPath查询原语来做到这一点?否则,我将不得不使用bash命令,而这对于JMESPath来说仍然有很多不足之处。

2 个答案:

答案 0 :(得分:1)

您似乎可以使用--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

的更多详细信息

答案 1 :(得分:1)

我在使用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

}