如何通过yq根据account_id获取deploy_iam属性值?
用yq(v4.25.3)根据指定account_id获取对应deploy_iam属性值
问题场景
给定accounts.yml文件内容如下:
accounts: - account_id: 'XXXXXXXX' name: sandbox deploy_iam: true role: arn:aws:iam::XXXXXXXX:role/iam_role regions: - all - account_id: 'YYYYYYY' name: dev deploy_iam: true role: arn:aws:iam::YYYYYYY:role/iam_role regions: - all
需要实现:根据指定的account_id值,获取该账户对应的deploy_iam属性值。此前已能通过yq '.accounts[].account_id' < accounts.yml列出所有account_id,但尝试的with_entries命令未生效:
yq '.accounts[].account_id |= with_entries(select(.key == "XXXXXXXX"))' < accounts.yml
有效解决方法
针对yq v4.25.3,以下几种命令可以实现需求:
方法1:直接过滤并提取属性
通过select()筛选出匹配指定account_id的账户对象,再提取deploy_iam字段:
yq '.accounts[] | select(.account_id == "XXXXXXXX") | .deploy_iam' < accounts.yml
执行后会直接输出目标值(示例中为true)。
方法2:保留数组结构后提取
如果需要先过滤出所有匹配的账户(即使只有一个),再提取属性,可以用map():
yq '.accounts | map(select(.account_id == "XXXXXXXX")) | .[0].deploy_iam' < accounts.yml
map()会返回匹配的账户数组,.[]取第一个元素的deploy_iam属性。
方法3:处理无匹配的边界情况
若要避免指定account_id不存在时输出为空,可以添加默认值:
yq '.accounts[] | select(.account_id == "ZZZZZZZZ") | .deploy_iam // "not found"' < accounts.yml
当无匹配账户时,会输出not found。
原命令失败原因
你之前的命令逻辑有误:
.accounts[].account_id遍历的是每个账户的account_id字符串字段,而with_entries()仅适用于键值对对象,无法作用于字符串,因此命令无效。- 正确逻辑应该是先筛选整个账户对象,再从中提取目标属性,而非直接操作
account_id字段。
内容的提问来源于stack exchange,提问作者Mornor
相关产品推荐
相关产品推荐

