yq 是什么
yq 是 YAML 世界的 jq:读字段、筛选节点、批量改值、格式互转,一条命令搞定。Kubernetes 清单、CI 配置、容器编排文件都是 YAML,用 yq 提取字段与做条件判断比文本工具可靠,因为它按结构解析而不是按行匹配。要注意同名工具有两个互不兼容的实现,表达式语法差别很大,脚本里必须先确认装的是哪一个。
基本信息
| 适用平台 | Linux、macOS、Windows(单文件可执行程序) |
|---|---|
| 语法 | yq '表达式' 文件.yaml |
| 实现差异 | 有按路径表达式的实现与包装其他引擎的实现,语法不通用 |
| 常用能力 | 提取字段、列出键、条件筛选、原地修改、格式互转 |
| 原地修改 | 支持直接写回文件 |
| 风险 | 重写会规范化格式,注释与空行可能丢失 |
典型使用场景
- 从部署清单里批量提取镜像地址或副本数做核对。
- 批量修改多个 YAML 的某个字段,例如统一镜像版本。
- 把 YAML 转成 JSON 交给只支持 JSON 的工具处理。
- 列出编排文件里的全部服务名,做资产或依赖盘点。
- 条件筛选:找出满足特定条件的条目。
常用写法
常用写法
yq '.spec.containers[].image' deploy.yaml # 提取字段
yq '.services | keys' docker-compose.yml # 列出服务名
yq '.[] | select(.name == "app")' list.yaml # 条件筛选
yq -i '.replicas = 3' deploy.yaml # 原地修改
yq -o=json '.' config.yaml > config.json # 转成 JSON
yq --version # 确认是哪个实现
git diff deploy.yaml # 改完复核差异场景与写法对照
| 场景 | 写法 | 使用要点 |
|---|---|---|
| 提取字段 | 按路径选择 | 结构解析,比按行匹配可靠 |
| 列出键 | 取键集合 | 盘点服务名与字段很方便 |
| 条件筛选 | 按表达式过滤 | 比逐文件人工核对快 |
| 原地修改 | 直接写回文件 | 先不带写入参数预览输出再落地 |
| 格式互转 | 指定输出格式 | 交给 JSON 工具链时常用 |
| 版本确认 | 查版本 | 两个实现语法不同,必查 |
两个同名工具语法不兼容:一个按路径表达式,一个包装其他引擎。脚本里必须先用版本命令确认实现,否则表达式可能完全不起作用。
原地修改会规范化整个文件的格式:注释与空行可能被重新排列甚至丢失,改前先提交版本控制,改后用差异对比复核。
改 Kubernetes 配置时先不带写入参数打印一遍结果,确认结构无误再原地落地,避免把清单改坏。