$ terminals _

jq

命令行 JSON 处理器

🌐 官网 GitHub brew install jq

简介

jq 是一个轻量级且功能强大的命令行 JSON 处理器,类似于用于 JSON 数据的 sedawkgrep。它能够对 JSON 数据进行切片、过滤、映射和转换,语法简洁而表达力强。无论是简单的字段提取还是复杂的数据重组,jq 都能从容应对。

作为命令行环境中处理 JSON 数据的事实标准工具,jq 在 API 调试、日志分析、配置文件处理等场景中被广泛使用。它完全用 C 语言编写,无运行时依赖,处理速度极快。jq 的过滤器语法虽然初学时稍有门槛,但一旦掌握,就能大幅提升处理结构化数据的效率。

安装

# macOS
brew install jq

# Ubuntu/Debian
sudo apt install jq

# 从源码编译
git clone https://github.com/jqlang/jq.git
cd jq && autoreconf -i && ./configure && make

核心特性

  • 强大的过滤器: 提供丰富的内置函数和操作符
  • 管道语法: 支持过滤器之间的管道组合,灵活处理数据
  • 格式化输出: 自动美化打印 JSON,带语法着色
  • 数据转换: 支持 JSON 到 CSV、TSV 等格式的转换
  • 条件过滤: 支持 selectif-then-else 等条件表达式
  • 零依赖: 纯 C 实现,单一二进制文件,开箱即用

使用示例

# 美化打印 JSON
echo '{"name":"fd","lang":"rust"}' | jq '.'

# 提取单个字段
curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'

# 提取嵌套字段
jq '.data.user.name' response.json

# 遍历数组并提取字段
jq '.items[] | .name' data.json

# 条件过滤
jq '.[] | select(.age > 18)' users.json

# 构造新的 JSON 对象
jq '{name: .user.login, stars: .stargazers_count}' repo.json

# 数组长度和统计
jq '.items | length' data.json

# 将 JSON 数组转为 TSV
jq -r '.[] | [.name, .age] | @tsv' users.json

# 合并多个 JSON 文件
jq -s '.[0] * .[1]' base.json override.json

# 原地编辑(配合 sponge)
jq '.version = "2.0"' package.json | sponge package.json

典型场景

场景一:处理 API 响应,提取关键字段

调试 REST API 时格式化并提取数据:

# 查看 GitHub 仓库信息,只提取关心的字段
curl -s https://api.github.com/repos/jqlang/jq \
  | jq '{name, stars: .stargazers_count, language, updated: .updated_at}'

# 遍历 GitHub issues 列表,提取标题和状态
curl -s "https://api.github.com/repos/owner/repo/issues?state=all" \
  | jq '.[] | {title, state, number}'

# 从 AWS CLI 输出中提取实例 ID 列表
aws ec2 describe-instances \
  | jq -r '.Reservations[].Instances[].InstanceId'

场景二:日志分析和过滤

处理结构化 JSON 日志:

# 过滤 ERROR 级别日志
cat app.log | jq 'select(.level == "ERROR")'

# 统计各 HTTP 状态码出现次数
cat access.log | jq -r '.status' | sort | uniq -c | sort -rn

# 提取最近 10 条错误的时间和消息
cat app.log | jq 'select(.level == "ERROR") | {time: .timestamp, msg: .message}' \
  | tail -10

场景三:转换和重组 JSON 结构

处理配置文件或构建数据转换管道:

# 将扁平数组转为以 id 为 key 的对象(便于查找)
jq '[.[] | {(.id): .}] | add' users.json

# 合并两个配置文件(后者覆盖前者)
jq -s '.[0] * .[1]' defaults.json overrides.json > merged.json

# 将 JSON 转为 CSV(适合导入 Excel)
jq -r '.[] | [.name, .email, .age] | @csv' users.json > users.csv

# 给数组中每个对象添加字段
jq '[.[] | . + {processed: true}]' items.json

推荐搭配

  • curl — 获取 API 响应后用 jq 解析
  • fzf — 交互式浏览和筛选 JSON 数据
  • bat — 用 bat -l json 高亮查看 JSON 文件