在命令行里处理 JSON/YAML/CSV,不一定要写完整 Python 脚本,也不一定要开 Excel。命令行数据工具的价值是快速、可复现、可组合;它适合探索和轻量转换,不适合替代正式数据管道。
1. 命令行数据处理的场景
日常开发中,你经常需要处理各种格式的数据:
- API 响应:
curl拿到的 JSON,想快速提取某个字段 - 配置文件:docker-compose.yml、Kubernetes manifest 中的 YAML,需要批量修改
- 数据导出:数据库导出的 CSV,想按列统计或过滤
- 日志分析:结构化的日志文件,需要聚合和筛选
传统做法是打开 Excel 或写一段 Python 脚本——对于一次性查询来说太重了。命令行数据工具的哲学是:一条管道解决问题,可复现,可组合。
jq 已经在
01-command-line/06-现代CLI工具.md中详细介绍过,本节不再重复。以下工具与 jq 互补,覆盖 YAML、CSV 和交互式探索场景。
2. yq — YAML/JSON/TOML 的瑞士军刀
yq 的定位是”jq for YAML”,同时支持 JSON、TOML、XML 和 CSV。语法与 jq 高度兼容,熟悉 jq 后可以无缝切换。
# 读取值
yq '.services.web.image' docker-compose.yml
yq '.services[].ports[]' docker-compose.yml # 遍历数组
yq '.dependencies | keys | .[]' package.json
# 原地修改(-i 直接写文件,重要配置先备份)
yq -i '.version = "2.0.0"' Chart.yaml
yq -i '.services.web.image = "myapp:v2.0"' docker-compose.yml
# 格式互转
yq -o json config.yaml # YAML → JSON
yq -o yaml config.json # JSON → YAML
yq -P -o json config.toml # TOML → JSON
# 合并文件
yq '. *+ load("override.yaml")' base.yaml实际场景:批量修改 K8s 镜像标签
yq -i '.spec.template.spec.containers[].image |= sub(/:.+$/, ":v2.0")' deployment.yaml3. miller — CSV/TSV/JSON 的高级处理
miller(命令名 mlr)是命令行版的 awk + SQL。Excel 适合一次性查看,但无法自动化、不可复现;miller 的命令可以写进脚本,每次运行结果一致。
# 查看与格式转换
mlr --csv cat data.csv
mlr --icsv --ojson cat data.csv # CSV → JSON
# 过滤、排序、选择列
mlr --csv filter '$age > 30' data.csv
mlr --csv sort -f name data.csv
mlr --csv cut -f name,email data.csv
# 聚合统计
mlr --csv stats1 -a mean,min,max -f salary data.csv
mlr --csv stats1 -a mean -f salary -g department data.csv # 按部门分组
# 链式操作
mlr --csv filter '$status == "active"' then sort -f name data.csvmiller DSL 核心规则:$字段名 引用列值,支持算术运算($salary * 12)和字符串函数,链式操作用 then 连接。
4. xsv — 极速 CSV 工具箱
xsv 用 Rust 实现,专为处理 GB 级 CSV 文件设计。当 miller 不够快时,xsv 是更好的选择。
xsv headers data.csv # 查看列名
xsv stats data.csv # 统计摘要
xsv count data.csv # 快速行数
xsv select name,email data.csv # 选择列
xsv search -s name "John" data.csv # 按列搜索
xsv frequency -s department data.csv # 列值频率统计
xsv sample 100 data.csv # 随机采样
xsv join id users.csv id orders.csv # JOIN 两个 CSV与 miller 的分工:xsv 处理大文件和简单操作(速度极快),miller 处理复杂转换和聚合(DSL 强大)。
5. visidata — 交互式数据探索
visidata(命令名 vd)是终端里的表格软件。拿到陌生数据文件时,用它”看一眼”比猜字段名高效得多。
vd data.csv # 打开 CSV/TSV
vd data.json # 打开 JSON
vd database.sqlite # 打开 SQLite
vd report.xlsx # 打开 Excel
curl -s api/data | vd -f json # 直接探索管道输出核心快捷键:
| 按键 | 操作 | 按键 | 操作 |
|---|---|---|---|
| 方向键 | 导航 | / | 搜索 |
Enter | 进入/展开 | | | 按列过滤(正则) |
q | 退出/返回 | Shift+F | 频率统计 |
+ | 聚合 | Ctrl+S | 保存 |
? | 帮助 |
支持 CSV、TSV、JSON、NDJSON、SQLite、Excel、Parquet 等格式。典型工作流:先用 visidata 浏览结构,确认字段后再用 mlr 或 xsv 写精确查询。
6. 工具选型指南
| 工具 | 主要格式 | 速度 | 交互式 | 适用场景 |
|---|---|---|---|---|
| jq | JSON | 快 | ❌ | API 响应处理、JSON 转换 |
| yq | YAML/JSON/TOML | 快 | ❌ | 配置文件读写、格式互转 |
| miller | CSV/TSV/JSON | 中 | ❌ | 表格数据聚合、过滤、SQL 式操作 |
| xsv | CSV | 极快 | ❌ | 大文件处理、简单列操作 |
| visidata | 全格式 | 中 | ✅ | 交互式探索、快速浏览 |
决策流程
什么格式?
├── JSON → jq
├── YAML/TOML → yq
├── CSV 小文件(<100MB)→ miller
├── CSV 大文件(>100MB)→ xsv
└── 不确定/想先看看 → visidata典型工作流组合
# API 响应分析:提取字段 → 统计
curl -s api/users | jq -r '.[] | [.id, .name, .status] | @csv' \
| mlr --icsv --ojson cat
# 配置文件处理:读取 → 修改 → 验证
yq '.services[].image' docker-compose.yml
yq -i '.services.web.replicas = 3' docker-compose.yml
# 大数据文件:预处理 → 分析
xsv select name,status,department large_export.csv \
| mlr --csv filter '$status == "active"' then stats1 -a count -g department7. 使用原则
数据处理最怕“看起来对”。工具再顺手,也要保留输入、命令和输出边界。
# 配置文件处理:读取 -> 修改 -> 验证
yq '.services[].image' docker-compose.yml
yq -i '.services.web.replicas = 3' docker-compose.yml
# 表格聚合:按部门统计平均薪资
mlr --csv stats1 -a mean -f salary -g department employees.csv
# 大型 CSV:列频率统计
xsv frequency -s status --limit 10 large_export.csv修改配置先备份或走 Git:yq -i 很方便,也会直接写文件。重要配置先看 diff。
大文件先抽样:对 GB 级 CSV 先 xsv headers、xsv sample、xsv stats,不要一上来全量处理。
交互探索和正式处理分开:visidata 适合看结构、找字段;稳定任务应沉淀成 jq/yq/mlr/xsv 命令或脚本。
管道要保留格式契约:CSV 分隔符、引号、编码、表头和空值规则都可能影响结果。
延伸阅读
- yq GitHub — 官方仓库,完整文档和示例
- miller 官方文档 — DSL 参考和进阶用法
- xsv GitHub — Rust 实现的 CSV 工具
- visidata 官网 — 交互式数据探索工具