YAML工程师不得不会的神器yq-v4
简介
类似于常用的命令行下处理json的工具jq,处理yaml可以使用yq
在使用yq之前,我曾经使用sed将yaml作为普通的纯文本文件进行编辑,虽然也可以实现目的,但是一旦需求复杂以后,实现起来会比较困难,yq/jq这种可以对yaml或json的数据逻辑提供支持的工具可以更高效地实现复杂的操作。
版本
注意:yq的最新大版本是v4,其命令行和语法和以前的版本变化较大,网上目前文档大多是以前v3或更老版本的,请注意区分。
本文的整理基于v4版本。
增
- 合并多个yml文件的值:
yq ea '.global as $item ireduce ({}; . * $item )' 1.yml 2.yml
,其中.global
是待合并的yaml层级表示,示例表示把1.yml和2.yml里的.global
下的所有yml值做合并,生成一段新的yml - 从字面值创建yml:
yq -n '.b.c = "cat"'
删
- 原地删除yml文件的指定字段:
yq -i 'del(.global)' 1.yml
改
- 原地修改指定字段:
yq -i '.version = "abcde"' 1.yml
- 原地修改list中的每个子元素:
yq -i '.webhooks[].clientConfig.caBundle = 1234 ' config/webhook/manifests.yaml
- 从环境变量中读取目标值:
c=$(cat tls.crt|base64 -w 0) yq -i '.webhooks[].clientConfig.caBundle = env(c) ' config/webhook/manifests.yaml
。注意:如果写在Makefile里,需要根据Make的特性稍作修改。 - 将已有的yaml放进指定的前缀里:
- 从标准输入读入:
yq ea '.global as $item ireduce ({}; . * $item )' 1.yml 2.yml | yq '{"global": .}'
,将1.yml和2.yml的global字段合并,然后放到global字段里 - 从文件读入:
yq '{"c": {"d": . }}' data1.yml
- 从标准输入读入:
查
- 查询指定字段的值:
yq '.a.b.c' 1.yml
参考
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。