首页 > 开源 > yq:一个命令行搞定YAML、JSON、XML等八种格式处理

yq:一个命令行搞定YAML、JSON、XML等八种格式处理

AI垂直社区 2026-09-24 18:47 7 阅读 查看原文

yq 是一款用 Go 编写的轻量级可移植命令行数据处理工具,采用类似 jq 的语法,支持 YAML、JSON、XML、CSV、TOML、HCL、properties、INI 等八种以上格式的读取、修改、合并与转换。它无需依赖,下载即用,支持原地修改文件、环境变量注入、多文件合并等高级操作,是 DevOps 和云原生工作流中处理配置文件的瑞士军刀,已获 16000+ Star。

适用人群:1. DevOps 工程师和 SRE,需要批量处理和修改 Kubernetes、Terraform、Ansible 等配置文件;2. 后端开发者和云原生开发者,日常需要在 YAML、JSON、XML 等格式之间转换和提取数据;3. 运维人员和脚本编写者,希望在 Bash 脚本中高效解析和更新结构化数据文件

适用场景:1. 在 CI/CD 流水线中动态修改 Kubernetes YAML 清单,如更新镜像版本、注入环境变量;2. 将不同格式的配置文件互相转换,例如把 XML 配置迁移为 YAML 或把 JSON API 响应转为 TOML;3. 批量合并多个 YAML 配置文件并进行去重、筛选和原地更新,用于多环境配置管理

推荐理由:yq 将 jq 的强大表达力从 JSON 扩展到了 YAML、XML、CSV、TOML 等八种格式,一个二进制文件即可覆盖绝大多数配置处理需求。它无运行时依赖、跨平台、支持原地修改和管道操作,完美融入 Shell 脚本和 CI/CD 流程。对于任何需要与配置文件打交道的开发者来说,yq 都是值得加入工具箱的效率利器。

项目定位与背景

在现代软件开发和运维中,配置文件格式层出不穷:Kubernetes 用 YAML,Terraform 用 HCL,前端用 JSON,企业级系统用 XML,传统应用用 properties 或 INI。开发者往往需要为每种格式寻找不同的处理工具,学习成本高且难以在脚本中统一编排。mikefarah/yq 正是为解决这一痛点而生。它借鉴了 jq 在 JSON 处理领域的成功经验,将类似 jq 的语法和操作范式扩展到了 YAML、JSON、XML、CSV、TSV、TOML、HCL、properties 和 INI 等主流格式,用一个命令行工具统一了结构化数据的处理方式。项目使用 Go 语言编写,天然具备跨平台和零依赖的优势,目前已获得超过 16000 颗 Star,是 DevOps 工具链中的明星项目。

核心功能与技术架构

yq 的核心设计理念是格式无关的数据处理。它内部将各种输入格式统一解析为抽象的数据树,然后在其上执行用户编写的表达式,最后再序列化为目标格式输出。这种架构使得格式转换变得异常简单——只需通过 -o 参数指定输出格式即可。例如 yq -o json file.yaml 可以将 YAML 直接转为 JSON,yq -Poy sample.json 则把 JSON 转为格式化 YAML。

yq 的表达式语法高度兼容 jq,支持路径导航(如 .a.b[0].c)、管道操作、条件筛选、数组迭代、函数调用等。同时它针对 YAML 的特性做了大量增强,例如支持注释保留、多文档处理、锚点和别名的解析。yq 还提供了原地修改文件的能力(-i 参数),这在批量更新配置文件时极为实用。通过 strenv() 函数,用户可以将环境变量注入到配置文件中,非常适合在 CI/CD 中动态生成配置。

在合并操作方面,yq 支持使用乘法运算符(*)对多个文件进行深度合并,结合 ireduce 函数和 glob 通配符,可以一次性合并目录下所有 YAML 文件。这对于多环境、多层次的配置管理场景非常高效。

创新点与亮点

yq 最突出的创新在于打破了格式壁垒。传统上,处理 YAML 需要 yq 或 Python 的 PyYAML,处理 XML 需要 xmllint 或 xmlstarlet,处理 TOML 又需要专门的库。yq 用一个工具、一套语法解决了所有问题,极大降低了认知负担和脚本复杂度。

另一个亮点是它的可移植性。由于使用 Go 编译为静态二进制,yq 不需要任何运行时依赖,可以直接下载二进制文件放到任何 Linux、macOS 或 Windows 系统上运行。项目还提供了 Docker 镜像和多种包管理器支持(如 Homebrew、apt、scoop 等),安装方式灵活多样。

yq 对原地修改的支持也值得一提。yq -i 可以直接修改文件而不需要额外的重定向操作,这在编写幂等的配置管理脚本时非常方便。配合多行表达式,用户可以一次性对同一个文件执行多个更新操作,例如同时修改多个字段的值。

与同类项目对比

与 jq 相比,yq 的优势在于格式覆盖面更广。jq 只处理 JSON,虽然可以通过外部工具转换格式后再处理,但流程繁琐。yq 原生支持 YAML、XML、CSV 等格式,且语法与 jq 高度相似,jq 用户可以几乎零成本迁移。

与 Python 的 PyYAML 或 ruamel.yaml 相比,yq 不需要编写 Python 脚本,直接在命令行中完成操作,更适合 Shell 脚本和 CI/CD 流水线。与 xmllint 等专用工具相比,yq 提供了统一的语法体验,不需要为每种格式学习不同的命令行参数。

当然,yq 也有其局限性。它并不支持 jq 的全部功能,某些复杂的 jq 表达式可能无法直接使用。对于极其复杂的转换逻辑,编写专门的脚本可能仍然更合适。此外,yq 在处理超大文件时的性能表现也值得关注,尽管对于大多数配置文件来说这不会成为瓶颈。

上手指南或快速开始

安装 yq 非常简单,可以直接从 GitHub Releases 页面下载对应平台的二进制文件,也可以通过 Homebrew(brew install yq)、apt、scoop 等包管理器安装,或者使用 Docker 镜像。

基本用法示例:读取值使用 yq '.a.b[0].c' file.yaml;原地修改使用 yq -i '.a.b[0].c = "cool"' file.yaml;使用环境变量使用 NAME=mike yq -i '.a.b[0].c = strenv(NAME)' file.yaml;格式转换使用 yq -o json file.yaml 或 yq -Poy sample.json。

对于进阶用户,可以尝试多文件合并:yq ea '. as $item ireduce ({}; . * $item )' path/to/*.yml,以及数组元素查找更新:yq -i '(.[] | select(.name == "foo") | .address) = "12 cat st"' data.yaml。官方文档和 recipes 页面提供了大量实用示例,建议深入阅读。

总结与展望

yq 是一款设计精良、实用性极强的命令行工具,它用统一的语法和零依赖的二进制覆盖了八种以上的数据格式,极大地简化了配置文件的处理流程。无论你是 DevOps 工程师、后端开发者还是运维人员,yq 都能显著提升你的工作效率。随着云原生生态的持续发展,配置文件的数量和复杂度只会增加,yq 这类工具的价值也将愈发凸显。未来如果能在性能优化和 jq 功能兼容性上继续推进,yq 有望成为结构化数据处理领域的事实标准工具。

项目信息

项目名称 mikefarah/yq
编程语言 Go
Star 数 16004
Fork 数 1412
主题标签 bash, cli, csv, devops-tools, golang, hcl, json, portable, properties, splat, terraform, toml, xml, yaml, yaml-processor

查看 GitHub 项目 →