You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:24:31