11个版本 (6个重大更新)
0.10.2 | 2024年3月6日 |
---|---|
0.10.0 | 2023年11月14日 |
#4 in #json-input
每月275次下载
22KB
263 行
whyq - 低开销的yq实现
一个轻量级且便携的 jq 包装器,用于通过将数据转换为 JSON 并传递给 jq
来从 YAML/TOML/JSON 文档中执行任意查询,然后将结果作为原始 jq
输出返回,或者将其转换回 TOML 或 YAML。
安装
通过 cargo
cargo install whyq
或者从 发布版 下载预构建版本,手动或通过 binstall
cargo binstall whyq
注意:依赖于已安装的 jq
。
为什么 / 为什么不
jq 兼容性
- 在任意输入格式(yaml/toml/json)上使用
jq
的任意功能 - 相同的过滤语法(通过
jq
外部执行) - 与
jq
的命令行界面匹配(仅添加一些额外的输入/输出格式控制标志) - 支持
jq
输出格式化程序,如-c
、-r
和-j
(紧凑、原始、连接输出分别) - 支持所有输入格式的 jq 模块
功能
- 读取 多文档 YAML 输入,处理 YAML 合并键(展开标签)
- 从 stdin 或文件读取(如果最后一个参数是文件,则为文件)
- 输出转换快捷键:
-y
(YAML)或-t
(TOML) - 是 python-yq 的替代品(提供
yq
) - ~1MB 的二进制大小(适用于小型云 CI 图像 / binstall CI 动作)
限制
- 通过
jq
外部执行(支持您的jq
版本支持的任何功能) - 展开 YAML 标签(输入是 单例映射 -> 递归映射,然后 合并) - 因此输出中不保留标签
- 不支持保留缩进(在 serde_yaml 中不受支持)
- 不支持输入文档中的重复键
- 不支持 XML/CSV(或其他更特殊的格式)
用法
YAML 输入
可以使用 jq 通过 stdin
$ yq '.[3].kind' -r < test/deploy.yaml
Service
$ yq -y '.[3].metadata' < test/deploy.yaml
labels:
app: controller
name: controller
namespace: default
或从文件参数(在末尾)
$ yq '.[3].kind' -r test/deploy.yaml
$ yq -y '.[3].metadata' test/deploy.yaml
默认输入格式是 YAML,这也是该二进制文件命名的由来(以及最常见的使用场景)。
TOML 输入
使用此存储库中的 Cargo.toml
作为输入,并将 tq='yq --input=toml'
作为别名
$ tq '.package.categories[]' -r < Cargo.toml
command-line-utilities
parsing
$ tq -t '.package.metadata' < Cargo.toml
[binstall]
bin-dir = "yq-{ target }/{ bin }{ format }"
pkg-url = "{ repo }/releases/download/{ version }/yq-{ target }{ archive-suffix }"
$ tq -y '.dependencies.clap' < Cargo.toml
features:
- cargo
- derive
version: 4.4.2
$ tq '.profile' -c < Cargo.toml
{"release":{"lto":true,"panic":"abort","strip":"symbols"}}
将 alias tq='yq --input=toml'
添加到您的 .bashrc
或 .zshrc
(等)中,如果您觉得这很有用,可以使其永久化。
JSON 输入
如果您需要将 json 转换为其他格式,请传递 --input=json
$ yq --input=json '.ingredients | keys' -y < test/guacamole.json
- avocado
- coriander
- cumin
- garlic
- lime
- onions
- pepper
- salt
- tomatoes
高级示例
使用嵌套查询和原始输出进行选择
$ yq '.spec.template.spec.containers[].image' -r < test/grafana.yaml
quay.io/kiwigrid/k8s-sidecar:1.24.6
quay.io/kiwigrid/k8s-sidecar:1.24.6
docker.io/grafana/grafana:10.1.0
在多文档上进行选择
$ yq -y '.[] | select(.kind == "Deployment") | .spec.template.spec.containers[0].ports[0].containerPort' test/deploy.yaml
8000
转义包含斜杠等字符的键
yq -y '.updates[] | select(.["package-ecosystem"] == "cargo") | .groups' .github/dependabot.yml
使用来自 jq
的辅助函数(例如,k.jq)
$ yq 'include "k"; .[] | gvk' -r -L$PWD/test/modules < test/deploy.yaml
v1.ServiceAccount
rbac.authorization.k8s.io/v1.ClusterRole
rbac.authorization.k8s.io/v1.ClusterRoleBinding
v1.Service
apps/v1.Deployment
输出注意事项
输出格式,如 YAML 的 -y
或 TOML 的 -t
,将需要 jq
输出的可解析 JSON。如果您传递 -r
、-c
或 -c
以获取原始/紧凑输出,那么这通常不能作为 JSON 解析。
调试日志
当设置 RUST_LOG
时,项目会尊重这些诊断日志并发送到 stderr
$ RUST_LOG=debug yq '.version' test/circle.yml
2023-09-18T23:17:04.533055Z DEBUG yq: args: Args { input: Yaml, output: Jq, yaml_output: false, toml_output: false, in_place: false, jq_query: ".version", file: Some("test/circle.yml"), compact_output: false, raw_output: false, join_output: false, modules: None }
2023-09-18T23:17:04.533531Z DEBUG yq: found 1 documents
2023-09-18T23:17:04.533563Z DEBUG yq: input decoded as json: {"definitions":{"filters":{"on_every_commit":{"tags":{"only":"/.*/"}},"on_tag":{"branches":{"ignore":"/.*/"},"tags":{"only":"/v[0-9]+(\\.[0-9]+)*/"}}},"steps":[{"step":{"command":"chmod a+w . && cargo build --release","name":"Build binary"}},{"step":{"command":"rustc --version; cargo --version; rustup --version","name":"Version information"}}]},"jobs":{"build":{"docker":[{"image":"clux/muslrust:stable"}],"environment":{"IMAGE_NAME":"whyq"},"resource_class":"xlarge","steps":["checkout",{"run":{"command":"rustc --version; cargo --version; rustup --version","name":"Version information"}},{"run":{"command":"chmod a+w . && cargo build --release","name":"Build binary"}},{"run":"echo versions"}]},"release":{"docker":[{"image":"clux/muslrust:stable"}],"resource_class":"xlarge","steps":["checkout",{"run":{"command":"rustc --version; cargo --version; rustup --version","name":"Version information"}},{"run":{"command":"chmod a+w . && cargo build --release","name":"Build binary"}},{"upload":{"arch":"x86_64-unknown-linux-musl","binary_name":"${IMAGE_NAME}","source":"target/x86_64-unknown-linux-musl/release/${IMAGE_NAME}","version":"${CIRCLE_TAG}"}}]}},"version":2.1,"workflows":{"my_flow":{"jobs":[{"build":{"filters":{"tags":{"only":"/.*/"}}}},{"release":{"filters":{"branches":{"ignore":"/.*/"},"tags":{"only":"/v[0-9]+(\\.[0-9]+)*/"}}}}]},"version":2}}
2023-09-18T23:17:04.533650Z DEBUG yq: jq args: [".version"]
2023-09-18T23:17:04.538606Z DEBUG yq: jq stdout: 2.1
2.1
依赖项
~11MB
~184K SLoC