一个轻量级、可移植的命令行 YAML、JSON 和 XML 处理器。 yq
使用类似 jq 的语法,但适用于 yaml 文件以及 json、xml、properties、csv 和 tsv。它还不支持jq
所做的所有操作 - 但它确实支持最常见的操作和功能,并且正在不断添加更多功能。
yq 是用 go 编写的 - 因此您可以为您的平台下载一个无依赖的二进制文件,然后就可以开始了!如果您愿意,可以使用各种包管理器以及 Docker 和 Podman,下面列出了所有这些。
读取一个值:
yq '.ab[0].c' 文件.yaml
来自 STDIN 的管道:
yq '.ab[0].c' < 文件.yaml
就地更新 yaml 文件
yq -i '.ab[0].c = "cool"' file.yaml
使用环境变量更新
NAME=mike yq -i '.ab[0].c = strenv(NAME)' file.yaml
合并多个文件
# 合并两个文件 yq -n 'load("file1.yaml") * load("file2.yaml")'# 使用 glob 进行合并:# 注意使用 `ea` 一次评估所有文件# 而不是按顺序评估所有文件yq ea'。 as $item ireduce ({}; . * $item )' path/to/*.yml
对 yaml 文件进行多次更新
yq -i ' .ab[0].c = "酷" | .xyz =“foobar”| .person.name = strenv(NAME)' file.yaml
查找并更新数组中的项目:
yq '(.[] | select(.name == "foo") | .address) = "12 cat st"'
将 JSON 转换为 YAML
yq-Poy 样本.json
请参阅食谱以获取更多示例,并参阅文档以获取更多信息。
查看常见问题和酷想法的讨论
使用 wget 下载 gzip 的预编译二进制文件:
例如,VERSION=v4.2.0 和 BINARY=yq_linux_amd64
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY}.tar.gz -O - | tar xz && mv ${BINARY} /usr/bin/yq
wget https://github.com/mikefarah/yq/releases/download/${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq
wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && chmod +x /usr/bin/yq
使用自制软件
brew install yq
snap install yq
yq
安装受到严格限制,这意味着它无法直接访问根文件。要读取根文件,您可以:
sudo cat /etc/myfile | yq '.a.path'
要写入根文件,您可以使用海绵:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo sponge /etc/myfile
或写入临时文件:
sudo cat /etc/myfile | yq '.a.path = "value"' | sudo tee /etc/myfile.tmp sudo mv /etc/myfile.tmp /etc/myfile rm /etc/myfile.tmp
docker run --rm -v "${PWD}":/workdir mikefarah/yq [命令] [标志] [表达式]FILE...
请注意,如果您愿意,您可以在没有网络访问权限和其他权限的情况下在 docker 中运行yq
,即--security-opt=no-new-privileges --cap-drop all --network none
。
podman run --rm -v "${PWD}":/workdir mikefarah/yq [命令] [标志] [表达式]FILE...
您需要将-i--interactive
标志传递给 docker:
docker run -i --rm mikefarah/yq '.this.thing' < myfile.yml
podman run -i --rm mikefarah/yq '.this.thing' < myfile.yml
docker run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
podman run --rm -it -v "${PWD}":/workdir --entrypoint sh mikefarah/yq
使用 bash 函数来避免输入整个 docker 命令会很有用:
yq() { docker run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
yq() { podman run --rm -i -v "${PWD}":/workdir mikefarah/yq "$@"}
yq
的容器镜像不再在 root 下运行 (#860)。如果您想在容器映像中安装更多内容,或者在尝试读/写文件时遇到权限问题,您需要:
docker run --user="root" -it --entrypoint sh mikefarah/yq
podman run --user="root" -it --entrypoint sh mikefarah/yq
或者,在您的 Dockerfile 中:
FROM mikefarah/yq USER root RUN apk add --no-cache bash USER yq
默认情况下,yq 使用的高山图像不包含时区数据。如果您想使用tz
运算符,则需要包含以下数据:
FROM mikefarah/yq USER root RUN apk add --no-cache tzdata USER yq
如果您将 podman 与 SELinux 结合使用,则需要在卷挂载上设置共享卷标志:z
:
-v "${PWD}":/workdir:z
- name: Set foobar to cool uses: mikefarah/yq@master with: cmd: yq -i '.foo.bar = "cool"' 'config.yml' - name: Get an entry with a variable that might contain dots or spaces id: get_username uses: mikefarah/yq@master with: cmd: yq '.all.children.["${{ matrix.ip_address }}"].username' ops/inventories/production.yml - name: Reuse a variable obtained in another step run: echo ${{ steps.get_username.outputs.result }}
有关更多信息,请参阅 https://mikefarah.gitbook.io/yq/usage/github-action。
go install github.com/mikefarah/yq/v4@latest
由于这些受到社区的支持❤️ - 但是,它们可能与官方支持的版本已经过时。
请注意,Debian 软件包(之前由 @rmescandon 支持)不再维护。请使用替代安装方法。
在 x-cmd 上查看yq
:https://x-cmd.com/mod/yq
即时结果:实时查看 yq 过滤器的输出。
错误处理:遇到语法错误?它将显示错误消息和最接近的有效过滤器的结果
谢谢@edwinjhlee!
nix profile install nixpkgs#yq-go
看这里
webi yq
请参阅 @adithyasunil26 支持的 webi (https://github.com/webinstall/webi-installers/tree/master/yq)
pacman -S go-yq
使用巧克力
choco install yq
由@chillum 支持 (https://chocolatey.org/packages/yq)
使用勺子
scoop install main/yq
使用winget
winget install --id MikeFarah.yq
使用 MacPort
sudo port selfupdate sudo port install yq
由@herbygillot 支持(https://ports.macports.org/maintainer/github/herbygillot)
Alpine Linux v3.20+(和 Edge):
apk add yq-go
Alpine Linux v3.19 版本:
apk add yq
由 Tuan Hoang 支持 (https://pkgs.alpinelinux.org/packages?name=yq-go)
Flox 可用于通过 WSL 在 Linux、MacOS 和 Windows 上安装 yq。
flox install yq
包含许多示例的详细文档
用便携式 go 编写,因此您可以下载一个可爱的无依赖二进制文件
使用与jq
类似的语法,但适用于 YAML、JSON 和 XML 文件
完全支持多文档yaml文件
支持 yaml 前面的内容块(例如 jekyll/assemble)
彩色 yaml 输出
使用 TZ 进行日期/时间操作和格式化
深入数据结构
排序键
操作 yaml 注释、样式、标签、锚点和别名。
更新到位
选择和更新复杂的表达式
更新时保留 yaml 格式和注释(尽管存在空格问题)
解码/编码 Base64 数据
从其他文件加载内容
与 json/ndjson 相互转换
与 xml 相互转换
与属性之间的转换
与 csv/tsv 相互转换
通用 shell 完成脚本 (bash/zsh/fish/powershell)
减少以合并多个文件或对数组求和或其他奇特的东西。
在自动化管道中使用的 Github Action(感谢@devorbitus)
查看文档以了解更详细和高级的用法。
Usage: yq [flags] yq [command] Examples: # yq defaults to 'eval' command if no command is specified. See "yq eval --help" for more examples. yq '.stuff' < myfile.yml # outputs the data at the "stuff" node from "myfile.yml" yq -i '.stuff = "foo"' myfile.yml # update myfile.yml in place Available Commands: completion Generate the autocompletion script for the specified shell eval (default) Apply the expression to each document in each yaml file in sequence eval-all Loads _all_ yaml documents of _all_ yaml files and runs expression once help Help about any command Flags: -C, --colors force print with colors -e, --exit-status set exit status if there are no matches or null or false is returned -f, --front-matter string (extract|process) first input as yaml front-matter. Extract will pull out the yaml content, process will run the expression against the yaml content, leaving the remaining data intact --header-preprocess Slurp any header comments and separators before processing expression. (default true) -h, --help help for yq -I, --indent int sets indent level for output (default 2) -i, --inplace update the file in place of first file given. -p, --input-format string [yaml|y|xml|x] parse format for input. Note that json is a subset of yaml. (default "yaml") -M, --no-colors force print with no colors -N, --no-doc Don't print document separators (---) -n, --null-input Don't read input, simply evaluate the expression given. Useful for creating docs from scratch. -o, --output-format string [yaml|y|json|j|props|p|xml|x] output format type. (default "yaml") -P, --prettyPrint pretty print, shorthand for '... style = ""' -s, --split-exp string print each result (or doc) into a file named (exp). [exp] argument must return a string. You can use $index in the expression as the result counter. --unwrapScalar unwrap scalar, print the value with no quotes, colors or comments (default true) -v, --verbose verbose mode -V, --version Print version information and quit --xml-attribute-prefix string prefix for xml attributes (default "+") --xml-content-name string name for xml content (if no attribute name is present). (default "+content") Use "yq [command] --help" for more information about a command.
yq
尝试尽可能保留注释位置和空格,但它不能处理所有场景(详细信息请参阅 https://github.com/go-yaml/yaml/tree/v3)
Powershell有自己的...意见,引用yq
“yes”、“no”在 yaml 1.2 标准中被删除为布尔值 - 这是 yq 假设的标准。
请参阅提示和技巧,了解更常见的问题和解决方案。