在命令行里处理 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.yaml

3. 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.csv

miller 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. 工具选型指南

工具主要格式速度交互式适用场景
jqJSONAPI 响应处理、JSON 转换
yqYAML/JSON/TOML配置文件读写、格式互转
millerCSV/TSV/JSON表格数据聚合、过滤、SQL 式操作
xsvCSV极快大文件处理、简单列操作
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 department

7. 使用原则

数据处理最怕“看起来对”。工具再顺手,也要保留输入、命令和输出边界。

# 配置文件处理:读取 -> 修改 -> 验证
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

修改配置先备份或走 Gityq -i 很方便,也会直接写文件。重要配置先看 diff。

大文件先抽样:对 GB 级 CSV 先 xsv headersxsv samplexsv stats,不要一上来全量处理。

交互探索和正式处理分开:visidata 适合看结构、找字段;稳定任务应沉淀成 jq/yq/mlr/xsv 命令或脚本。

管道要保留格式契约:CSV 分隔符、引号、编码、表头和空值规则都可能影响结果。

延伸阅读