苦苦挣扎了一段时间,我离解决方案还很近。我使用的经验不是很丰富jq
。
我想从一个json文件中获取值,然后在dict中的其他值匹配时将它们添加到另一个文件中。下面的示例文件比解释更清楚地说明了我想要的内容。
hosts.json:
{
"hosts": [
{
"host": "hosta.example.com",
"hostid": "101",
"proxy_hostid": "1"
},
{
"host": "hostb.example.com",
"hostid": "102",
"proxy_hostid": "1"
},
{
"host": "hostc.example.com",
"hostid": "103",
"proxy_hostid": "2"
}
]
}
proxies.json:
{
"proxies": [
{
"host": "proxy1.example.com",
"proxyid": "1"
},
{
"host": "proxy2.example.com",
"proxyid": "2"
}
]
}
我还提供了上面的文件,其中proxyid作为密钥,如果这样做更容易:
{
"proxies": {
"1": {
"host": "proxy1.example.com",
"proxyid": "1"
},
"2": {
"host": "proxy2.example.com",
"proxyid": "2"
}
}
}
使用上面的这些json文件(来自Zabbix API),我想将.proxies[].host
(from proxies.json
)的值添加为.hosts[].proxy_host
(to hosts.json
)。
只有当.hosts[].proxy_hostid
等于.proxies[].proxyid
所需的输出:
{
"hosts": [
{
"host": "hosta.example.com",
"hostid": "101",
"proxy_hostid": "1",
"proxy_host": "proxy1.example.com"
},
{
"host": "hostb.example.com",
"hostid": "102",
"proxy_hostid": "1",
"proxy_host": "proxy1.example.com"
},
{
"host": "hostc.example.com",
"hostid": "103",
"proxy_hostid": "2",
"proxy_host": "proxy2.example.com"
}
]
}
我尝试了许多不同的方法来执行此操作,并且认为我需要使用jq -s
或jq --slurpfile
,但是我遇到了很多麻烦,无法找到解决方案。
jq 'input as $p | map(.[].proxy_host = $p.proxies[].proxyid)' hosts.json proxies.json
我想我也需要类似的东西,但不确定如何使用它。
if .hosts[].proxy_hostid == .proxies[].proxyid then .hosts[].proxy_host = .proxies[].host else empty end'
我发现了这些问题,但没有帮助:(
使用的另一种版本确实更容易proxies.json
。您所需要做的就是将代理存储在变量中作为参考,并在更新主机时从中检索代理主机。
jq 'input as { $proxies } | .hosts[] |= . + { proxy_host: $proxies[.proxy_hostid].host }' hosts.json proxies.json
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句