如何用jq读取嵌套JSON数组并将单个值存入变量?
使用jq获取JSON数组中指定状态的VM IP地址
环境信息JSON文件
{ "environments": { "dev": [ { "id": "1", "vm-IP": "ww.www.ww.ww", "sql-name": "vmname1.eastus.cloudapp.azure.com", "status": "inactive" }, { "id": "2", "vm-IP": "xx.xxx.xx.xx", "sql-name": "vmname2.eastus.cloudapp.azure.com", "status": "active" } ], "stg": { "id": "3", "vm-IP": "yy.yyy.yy.yy", "sql-name": "vmname3.eastus.cloudapp.azure.com" }, "prod": { "id": "4", "vm-IP": "zz.zzz.zz.zz", "sql-name": "vmname4.eastus.cloudapp.azure.com" } } }
可正常运行的stg环境脚本
针对非数组结构的stg环境,读取IP的脚本可以正常执行:
varFileName=myJsonFile.json # 查看STG对象 jq '.environments.stg' $varFileName # 获取stg的IP stgIP=$(jq -r '.environments.stg."vm-IP"' $varFileName) echo $stgIP
错误的dev环境脚本尝试
尝试获取dev数组中status为active的VM IP时,以下脚本均失败:
# 错误脚本1 devIP=$(jq -r '.environments.dev[]."vm-IP" | select(.status == "active")' $varFileName) # 报错:error: Cannot index string with string "status" # 错误脚本2 devIP=$(jq -r '.environments.dev[]."vm-IP" | select(.environments.dev[].status == "active")' $varFileName) # 报错:error: Cannot index string with string "environments"
正确的jq过滤命令
问题出在你先提取了vm-IP字符串,之后无法再访问该字符串的status属性。正确的做法是先筛选数组中符合status == "active"的对象,再提取vm-IP:
varFileName=myJsonFile.json devIP=$(jq -r '.environments.dev[] | select(.status == "active") | ."vm-IP"' $varFileName) echo $devIP
命令解释
.environments.dev[]:遍历dev数组中的每一个对象select(.status == "active"):筛选出status属性为active的对象."vm-IP":从筛选后的对象中提取vm-IP字段值
如果dev数组中可能存在多个active状态的对象,该命令会输出所有符合条件的IP,每行一个。
内容的提问来源于stack exchange,提问作者dbradish-gmail
相关产品推荐
相关产品推荐

