9个版本
0.3.6 | 2023年9月6日 |
---|---|
0.3.5 | 2023年9月6日 |
0.2.0 | 2023年9月5日 |
0.1.0 | 2023年8月31日 |
#1293 在 解析实现
34 每月下载量
18KB
127 行
yq
又一版jq包装器
A lightweight and portable Rust implementation of the common jq wrapper; yq
for doing arbitrary jq
style queries on YAML documents.
安装
通过 cargo
cargo install yjq
cargo binstall yjq
注意:依赖于已安装的 jq
。
特性
- 在yaml输入上使用任意的
jq
语法进行查询(我们传递大多数参数给jq
) - 处理多文档yaml输入(返回文档向量)
- 解包yaml标签(输入是 单例映射 递归)
- 允许将
jq
输出转换为 YAML (-y
) 或 TOML (-t
)
使用方法
作为 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
如果通过管道传递,则始终使用stdin。
高级示例
使用嵌套查询和原始输出进行选择
$ 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
参数优先级
除了输出选择器(如 -y
或 -t
)之外的所有参数都传递给 jq
。
约定:将 yq
参数放在前面,将 jq
参数放在后面。如果它抱怨,请使用 --
将参数组分开。
解释:参数解析器通常在与包含标志的剩余位置参数作斗争,因为它们缺乏“我们的标志”和“他们的标志”的概念,并会试图将它们匹配在一起。这意味着将yq和jq标志合并到单个参数中不会起作用,这就是为什么存在将两个参数明确分开的惯例。通常,如果您在中间放置一个正常的jq查询,分离会自动推断,但如果您没有任何正常的位置值参数,您可以在后面放置一个--
变量参数分隔符,以表明所有剩余的标志都是为jq
;
yq -y -c '.[3].kind' < test/deploy.yaml # fails; implicit separation is not detected for a flag first
yq -y '.[3].kind' -c < test/deploy.yaml # works; implicit separation detected after positional
yq -yc '.[3].kind' < test/deploy.yaml # fails; cannot combine of yq and jq args
yq -y -- -c '.[3].kind' < test/deploy.yaml # works; explicit separation
输出注意事项
输出格式,如用于YAML的-y
或用于TOML的-t
,将需要jq
的输出可解析为JSON。如果您传递了-r
用于原始输出,那么这将不能作为JSON解析。
限制
仅支持YAML/TOML(不支持XML - 欢迎提交PR)。调用jq
的外部命令。不保留YAML标签(输入是单例映射 递归)。CI上还没有二进制构建。
依赖关系
~7.5–10MB
~177K SLoC