【问题标题】:JMESPath extract raw values from listJMESPath 从列表中提取原始值
【发布时间】:2019-04-02 23:49:02
【问题描述】:

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

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

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

a
b
c

在理想情况下,有没有办法使用 JMESPath 查询原语来做到这一点?否则我将不得不使用 bash 命令,这对 JMESPath 有很多不足之处。

【问题讨论】:

    标签: azure-cli jmespath


    【解决方案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
    
    }
    

    【讨论】:

    • 我绝对发现jq 更胜一筹。不幸的是,因为az 工具内置了 jmespath,除非绝对必要,否则通常最好不要引入新工具
    【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-12-28
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多