如何用jq查询关联MAC与IPv4并输出指定格式的虚拟机信息
提取匹配MAC的VM IPv4地址并关联对应信息
需求
从指定JSON数据中,提取vm_network内与mac_address数组存在匹配的MAC地址对应的所有IPv4,输出格式为$guest_name, $mac_address, $ipv4,仅处理mac_address数组中包含的MAC条目。
原始JSON数据
{"virtual_machines": [ { "guest_name": "guest1", "mac_address": [ "00:01:02:03:04:05" ], "vm_network": { "00:01:02:03:04:05": { "ipv4": [ "192.168.2.23" ], "ipv6": [ "fe80::896:2e12:c059:4237" ] }, "c2:e3:7c:ac:60:c5": { "ipv4": [ "10.42.0.0" ], "ipv6": [] }, "5a:00:fb:5e:3d:65": { "ipv4": [ "10.42.0.1" ], "ipv6": [] } } }, { "guest_name": "guest2", "ip_address": "172.20.8.34", "mac_address": [ "10:11:12:13:14:15", "30:31:32:33:34:35" ], "vm_network": { "10:11:12:13:14:15": { "ipv4": [ "172.20.8.34" ], "ipv6": [] }, "30:31:32:33:34:35": { "ipv4": [ "172.16.172.34", "172.16.172.30" ], "ipv6": [ "fe80::ad7f:c2:f621:e718" ] } } } ] }
当前问题
现有jq命令仅能输出guest_name和ipv4,无法关联对应的MAC地址:
jq -r '.virtual_machines[] | .guest_name + ","+ (.vm_network[.mac_address[]] |.ipv4[])' < json_file
输出结果:
guest1,192.168.2.23 guest2,172.20.8.34 guest2,172.16.172.34 guest2,172.16.172.30
解决方案
使用以下jq命令,通过变量存储MAC地址和虚拟机名称,实现三者的关联输出:
jq -r '.virtual_machines[] | .guest_name as $name | .mac_address[] as $mac | .vm_network[$mac].ipv4[] | "\($name),\($mac),\(.)"' < json_file
命令解释
.virtual_machines[]:遍历所有虚拟机对象.guest_name as $name:将当前虚拟机名称存入变量$name,便于后续复用.mac_address[] as $mac:遍历当前虚拟机的每个MAC地址,存入变量$mac.vm_network[$mac].ipv4[]:取出当前MAC地址对应vm_network中的所有IPv4地址"\($name),\($mac),\(.)":通过字符串插值拼接成要求的格式
预期输出
guest1,00:01:02:03:04:05,192.168.2.23 guest2,10:11:12:13:14:15,172.20.8.34 guest2,30:31:32:33:34:35,172.16.172.34 guest2,30:31:32:33:34:35,172.16.172.30
内容的提问来源于stack exchange,提问作者Jose
相关产品推荐
相关产品推荐

