使用数字键使用 JQ 解析 JSON

使用数字键使用 JQ 解析 JSON

2000我有一个下面的curl,它传递jq 命令中的值,该命令返回正确的值......

curl -X GET \
  -H 'vmware-api-session-id: <auth-id>' \
  -k -s
  'https://<url>/api/vcenter/vm/vm-22' | python -m json.tool | jq -r '.disks."2000" | .label, .capacity' | paste - -

Hard disk 1 52143587328

现在我有了2000变量的这一部分。喜欢i=2000 和 jq 喜欢

jq -r '.disks."$i" 

回报

null null

我无法弄清楚如何2000通过变量传递它

答案1

jq -r --arg i "$i" '.disks[$i] | [ .label, .capacity ] | @tsv'

这会将 shell 变量传递ijq表达式中,如下所示jq多变的 $i(这是一个字符串)。您可以使用它作为密钥[$i]

paste我还通过使用@tsv包含您想要的两个值的数组来消除使用的需要jq。这将产生制表符分隔的输出,就像您的paste命令一样。

您也不应该需要传递数据python -m json.tool(我不知道这有什么好处)。如果它用于漂亮打印,则不需要输入到jq.


看着VMware API 文档,获取有关特定磁盘的信息的请求如下所示

https://{api_host}/api/vcenter/vm/{vm}/hardware/disk/{disk}

这让我认为您应该使用和(或) 代替vm-22,是您的虚拟机的名称,并且是您的磁盘标识符。{vm}2000"$i"{disk}vm-222000

这应该给你类似的东西

{
    "backing": {
        "type": "enum",
        "vmdk_file": "string"
    },
    "capacity": 0,
    "ide": {
        "master": false,
        "primary": false
    },
    "label": "string",
    "sata": {
        "bus": 0,
        "unit": 0
    },
    "scsi": {
        "bus": 0,
        "unit": 0
    },
    "type": "enum"
}

作为回应。

您可以将标签和容量解析为制表符分隔列表,使用

jq -r '[ .label, .capacity ] | @tsv'

相关内容