用途
jq 与 yq 是命令行下处理结构化数据的两个工具。jq 面向 JSON,yq 面向 YAML,同时可在多种格式之间转换。它们常用于 Shell 脚本、CI 流程和运维场景中解析、转换、过滤、提取结构化数据。
jq 的主要能力
- 取值:字段、嵌套字段、数组元素、多字段构造;可选字段访问
.b?在字段缺失时不报错。 - 数组操作:迭代
.[]、过滤select、映射map、length、first、flatten、切片。 - 对象数组:提取、过滤、排序、按字段分组
group_by、去重unique_by、min_by/max_by。 - 对象构造与解构:用字符串插值构建新对象、增删改名、
to_entries/from_entries、with_entries。 - 字符串处理:插值输出、
join/split、正则test/capture。 - 条件与空值:
if-then-else、//取默认值、try-catch、any/all。 - 聚合:
add、reduce、分组聚合统计。 - 递归查找:
..配合.name?、strings、numbers在任意深度查找。 - 输出与编码:
-r原始输出、-c紧凑输出、-s聚合为数组、-R原始输入、-n无输入生成、@tsv/@csv/@uri。 - CSV/TSV 转换:JSON 数组转带表头 CSV,CSV 逐行转 JSON。
- 环境变量:
--arg、--argjson、env读取。
yq 的主要能力
- 读写与原地编辑:取值、
-i原地修改、设置/删除字段、列出键。 - 选择与过滤:
select、has、按字段判断、提取容器镜像等嵌套路径。 - 合并:用
ea进行深合并(后者覆盖前者),或把多文档合并为一个。 - 格式转换:
-o=json、-P(JSON 转 YAML)、-o=xml、-o=props。 - 多文档:按
documentIndex选择、批量修改、统计文档数。
使用方式
两个工具都可直接以命令管道方式使用,也可写入脚本。jq 的典型调用形式为 echo '<json>' | jq '<filter>',yq 为 yq '<filter>' file.yaml。jq 的原地修改需借助临时文件或 sponge,yq 提供 -i 原地修改。
适用场景
资料给出的实际管道包括:用 curl 获取 API 响应后提取字段、分页收集、格式化为表格;解析 JSON 日志行并筛选错误、聚合日志级别;修改 package.json 版本、合并基础与覆盖配置、批量更新依赖;结合 kubectl 查询 Pod 名称与状态、修改 Deployment 副本数;对大文件使用 --stream、截断流、NDJSON 逐行处理、排序后比较两个大 JSON。
限制
yq -o=json、-o=xml、-o=props 等具体输出格式的支持范围与所用 yq 实现相关,资料未说明版本要求。jq 的原地修改没有内建标志,需外部命令配合。性能部分仅给出流式处理思路,未提供具体基准数据。