使用jq遍历JSON对象提取子网名称与CIDR范围的实现方法
jq批量提取子网名称与CIDR的实现方案
可直接运行的核心命令
针对你提供的测试JSON结构,无需复杂的对象转换操作,直接运行以下命令即可得到符合要求的输出:jq '.vnet_spoke_object.subnets[] | {name: .name, cidr: .cidr}'
命令逻辑说明
- jq原生支持对键值对形式的对象使用
[]语法完成全量遍历,不需要额外通过to_entries把对象转成数组才能迭代,定位到subnets节点后加[]就能遍历每个子网条目 - 遍历到每个子网条目后,直接构造仅包含
name、cidr两个字段的JSON对象,输出格式和你给出的参考示例完全匹配
适配多Vnet场景的通用版本
如果实际使用的JSON结构里,子网不是固定存放在vnet_spoke_object路径下,需要和你之前提取vnet名称、CIDR的逻辑保持一致,从所有顶层节点中筛选出包含subnets字段的Vnet块,可使用适配你原有使用习惯的命令:jq '.[] | select(.subnets != null) | .subnets[] | {name: .name, cidr: .cidr}'
关于你之前尝试的to_entries用法的说明
你了解到的用to_entries转换对象为可遍历数组的思路本身没有问题,只是没有匹配到实际的路径定位,才没得到预期结果:
- 只有当子网对象本身没有内置
name字段、需要把objectAsdf1这类对象键作为子网名称的场景,才需要用到to_entries完成转换,对应参考命令:jq '.vnet_spoke_object.subnets | to_entries | {name: .key, cidr: .value.cidr}' - 你之前运行的
.[] | to_entries | map_values(.value)命令没有输出符合要求的结果,核心原因是直接从JSON根节点遍历所有顶层字段,既没有定位到子网的实际存储路径,也没有在遍历完成后提取需要的name、cidr字段
内容的提问来源于stack exchange,提问作者Beefcake
相关产品推荐
相关产品推荐

