如何用jq转置数组元素生成DNS A记录所需键值对
用jq的map()和group_by()生成DNS A记录结构化数据
完全可以通过jq的map()和group_by()实现需求,下面分两种常用场景给出具体实现:
场景1:生成单FQDN对应单IP的独立条目
如果需要为每个FQDN单独生成一条对应IP的记录(即使同一FQDN对应多个IP),用map()配合字段展开即可:
jq命令
# 基于你已过滤Proxy非null、拆分FQDNList后的数组进行处理 map(. | {fqdn: .FQDNList[], ip: .IPAddress})
示例输入(过滤后的数据)
[ { "InstanceId": "i-123456", "IPAddress": "192.168.1.10", "FQDNList": ["app1.example.com", "app2.example.com"], "Proxy": null }, { "InstanceId": "i-789012", "IPAddress": "192.168.1.11", "FQDNList": ["app1.example.com", "app3.example.com"], "Proxy": null } ]
输出结果
[ {"fqdn": "app1.example.com", "ip": "192.168.1.10"}, {"fqdn": "app2.example.com", "ip": "192.168.1.10"}, {"fqdn": "app1.example.com", "ip": "192.168.1.11"}, {"fqdn": "app3.example.com", "ip": "192.168.1.11"} ]
场景2:按FQDN聚合所有对应IP
如果需要将同一FQDN的所有IP汇总成数组(适配DNS多IP A记录格式),可以在map()之后用group_by()分组:
jq命令
map(. | {fqdn: .FQDNList[], ip: .IPAddress}) | group_by(.fqdn) | map({fqdn: .[0].fqdn, ips: [.[].ip]})
输出结果
[ {"fqdn": "app1.example.com", "ips": ["192.168.1.10", "192.168.1.11"]}, {"fqdn": "app2.example.com", "ips": ["192.168.1.10"]}, {"fqdn": "app3.example.com", "ips": ["192.168.1.11"]} ]
命令逻辑说明
map(. | {fqdn: .FQDNList[], ip: .IPAddress}):遍历每个实例对象,将FQDNList中的域名逐个拆分,生成{fqdn, ip}的基础映射条目。group_by(.fqdn):按fqdn字段对所有条目分组,把同一域名的所有IP映射归为一组。map({fqdn: .[0].fqdn, ips: [.[].ip]}):将每组数据转换为“域名+IP数组”的结构,方便直接用于生成多IP的DNS A记录。
内容的提问来源于stack exchange,提问作者CDuv
相关产品推荐
相关产品推荐

