yq 常用 YAML/JSON 处理速查
常用命令
yq '.' config.yaml
yq '.spec.replicas' deployment.yaml
yq '.spec.template.spec.containers[].image' pod.yaml
yq '.metadata.labels' resource.yaml
yq '.spec.replicas = 3' deployment.yaml
yq -i '.spec.replicas = 3' deployment.yaml
yq '.metadata.labels.app = "web"' deployment.yaml
yq 'select(.kind == "Deployment")' manifests.yaml
yq -o=json '.' config.yaml
yq -P '.' config.json
yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1)' a.yaml b.yaml
常用表达式
| 表达式 |
含义 |
. |
原样输出 |
.foo.bar |
路径 |
.[0] / .[] |
数组 |
= |
赋值 |
| ` |
=` |
select() |
过滤 |
-o=json |
输出 JSON |
-P |
美化输出 |
-i |
就地修改 |
场景速查
| 目的 |
写法 |
| 读取镜像列表 |
yq '.spec.template.spec.containers[].image' deploy.yaml |
| 批量改副本数 |
yq -i '.spec.replicas = 3' deploy.yaml |
| YAML 转 JSON |
yq -o=json '.' file.yaml |
| 合并 YAML |
yq eval-all 'select(fileIndex==0) * select(fileIndex==1)' a.yaml b.yaml |
| 删除字段 |
yq 'del(.metadata.annotations)' file.yaml |
| 多文档处理 |
yq 'select(.kind == "Service")' all.yaml |
易错点
yq 有多个实现(mikefarah/yq 与 kislyuk/yq),语法不同;先确认版本。
-i 会直接改文件;先不加 -i 预览。
- 多文档 YAML 要确认是否逐文档处理;用
eval-all 或 -d。
- 字符串引号和布尔值(
yes/no)在 YAML 1.1/1.2 中语义不同。
- 合并策略(
*)对数组是替换还是追加,取决于实现和参数。
- 修改 Kubernetes 清单后要
kubectl diff 再 apply。
相关命令
jq — JSON 处理
kubectl — 应用清单
kustomize — 清单叠加