概述
- 参考文档:yq (mikefarah) Documentation
- 名为
yq的工具不止一个,主流是 Go 编写的mikefarah/yqv4,表达式语法刻意贴近jq yq --version输出mikefarah字样才是本文语法,v4 起子命令与表达式用空格分隔- 能力清单:字段取值、原地修改、多文档(
---分隔)遍历与拆分、跨格式转换,改值时保留注释是它相对 sed 的核心优势
快速开始
console
$ yq '.metadata.name' deploy.yaml # 取值,字符串裸输出
$ yq '.spec.replicas = 3' -i deploy.yaml # 原地改值
$ yq -o=json '.' deploy.yaml # YAML 转 JSON
- v4 的
e/eval是默认子命令可省略,ea/eval-all跨全部文件与全部文档求值
取值与过滤
路径语法:
.a.b.c逐层下钻,.items[0]数组下标,.items[].name迭代后继续下钻select过滤:yq '.[] | select(.env == "prod")'常用函数:
keys列键、length计数、tag看类型标签、line看节点所在行号,排错好用变量:
--arg name val配合$name引用,env(VAR)读环境变量:console$ yq '.image = env(IMG)' deploy.yaml文件参数可以省略,从 stdin 读:
cat a.yaml | yq '.x'
修改与赋值
- 赋值运算符:
=整体赋值:.spec.replicas = 3|=基于现值变换:yq '.name |= sub("v1"; "v2")'+=追加元素,.labels += {"k": "v"}
- 删除:
del(.metadata.annotations),多个路径一次删:del(.a, .b) - 改完落盘必须加
-i,不加时只打印结果不动文件 - 合并与拆分:
- 深度合并:
yq '. *= load("override.yaml")' -i base.yaml,右侧覆盖左侧 - 数组拆成多文档:
yq '.[] | split_doc' in.yaml
- 深度合并:
- 注释:修改已有键的值时原注释保留,这是管线里敢用
-i的前提
格式转换
输入输出格式分别用
-p与-o指定,JSON 与 YAML 互转最常用:console$ yq -p=json -o=yaml '.' config.json # JSON 转 YAML $ yq -P '.' config.json # -P 强制 pretty 风格输出其它支持:
xml、props、csv、tsv,XML 额外选项查手册JSON Lines 输入:
-p=json逐行解析,配合ea做流式汇总
多文档处理
YAML 文件里
---分隔多个文档,普通eval只作用于第一个文档,跨文档要ea:console$ yq ea 'select(.kind == "Deployment")' all-in-one.yaml # 只留 Deployment $ yq ea '.metadata.namespace = "prod"' -i *.yaml # 批量改命名空间按文档序号定位:
yq 'select(di == 1)'取第二个文档配合
fd等工具批量处理目录下全部清单,是 K8s 日常的固定搭配
K8s 实战
改镜像 tag:
console$ yq '.spec.template.spec.containers[0].image |= sub(":.*$"; ":v2")' -i deploy.yaml补 label 与注解:
console$ yq '.metadata.labels.app = "web"' -i deploy.yaml提取全部镜像名:
console$ yq ea '[.spec.template.spec.containers[].image]' *.yaml与
jq的分工:纯 JSON 场景直接jq,涉及 YAML、多文档或注释保留时用yq,表达式思路互相迁移
相关阅读
- jq 入门:语法的源头