Linux 结构化数据命令速查
更新时间:2026-08-28。本文是 Linux 命令速查主题第⑳族:结构化数据处理,约 17 个命令。第②族 文本处理 处理的是"没有结构的行",这一族面对的是有明确结构的数据——JSON、YAML、CSV、XML,以及"能不能直接对它跑 SQL"。基础的 JSON 取值见 现代工具,本文聚焦更深的查询与批量处理。
一、jq 过滤器语法
jq 的核心心智模型是:过滤器(filter)的管道。输入一个 JSON 流,每过一个过滤器就变换一次,用 | 串起来。掌握下面这几类过滤器,几乎能应付所有 JSON 变换场景——它不像 sed/awk 那样按行处理,而是理解数据本身的层次结构。
| 命令 | 作用 | 常用示例 |
|---|---|---|
jq | JSON 处理 DSL,用过滤器管道做切片、过滤、映射、聚合 | jq '.a.b'(取值);jq '.[]'(展开数组);jq '.[] | .name'(取每个元素的 name);jq 'map(.x)'(映射成数组);jq 'select(.age > 18)'(过滤);jq 'group_by(.city)[] | {city: .[0].city, n: length}'(分组统计);jq 'reduce .[] as $i (0; . + $i)'(归约求和) |
jq 常用函数 | 内置函数覆盖键操作、数组、字符串、数学与类型转换 | jq 'keys'(取键名);jq 'has("a")'(判断键存在);jq 'length';jq 'sort_by(.ts)'(排序);jq 'unique'(去重);jq 'to_entries'/from_entries(对象↔键值数组互转);jq -r '@csv'(输出成 CSV);jq '@base64d'(base64 解码) |
jq 参数 | 控制输入输出行为 | -r(原始输出,不加引号);-c(压缩单行);-s(slurp,把多行输入合成一个数组);--arg x v(传外部变量);-f filter.jq(从文件读过滤器,复杂逻辑推荐) |
复杂逻辑别硬塞在命令行里——把过滤器写成
.jq文件用-f加载,既好读又能进版本管理。另外jq默认把多个 JSON 对象当作独立输入逐个处理,想把它们当一个数组整体操作时要加-s(slurp)。
二、YAML 与跨格式
YAML 在配置文件领域几乎一统天下——Kubernetes 的资源清单、Docker Compose、各类 CI 流水线、各种应用的配置,清一色都是它。处理 YAML 有个特有的麻烦:它对缩进极其敏感,用按行处理思路的 sed 去改,很容易把缩进改坏,导致整个文件解析失败。而且这类错误往往不显眼,要等到程序真正读到那一行才暴露出来,排查起来挺费劲。所以改 YAML 一定要用理解它结构的工具,别图省事做文本替换。
| 命令 | 作用 | 常用示例 |
|---|---|---|
yq | YAML/TOML/XML 处理器,语法与 jq 高度一致,改 Kubernetes 配置、CI 配置的利器 | yq '.spec.replicas' deploy.yaml;yq -i '.spec.replicas = 3' deploy.yaml(原地修改);yq -o json '.' f.yaml(转 JSON);yq -o yaml -P '.' f.json(JSON 转 YAML);yq '.a.b' f.yaml f2.yaml(多文件) |
dasel | 统一查询/修改 JSON、YAML、TOML、XML、CSV,语法跨格式一致,脚本里换格式不用换命令 | dasel -f c.yaml '.spec.replicas';dasel -f d.json -w json '.a.b = 1'(写入);dasel -f x.toml -w yaml(格式转换) |
gron | 把 JSON 展平成可 grep 的赋值语句,用来反查"某个值在 JSON 里的路径是什么" | gron data.json | grep "name"(找路径);gron data.json | grep "name" | gron --ungron(还原出含该路径的 JSON 片段) |
gron的用法很讨巧:面对一个陌生的、几百行的 JSON,先gron展平再grep关键字,立刻就知道目标字段的完整路径,然后拿这个路径去写jq表达式。这比在 JSON 里一层层数括号快得多。
三、交互式浏览
命令行处理数据的尴尬在于看不到全貌——jq 输出一大坨文本,得来回滚动。jless、fx 这类工具提供可折叠、可搜索的交互界面,让人先看清结构再决定怎么切。
| 命令 | 作用 | 常用示例 |
|---|---|---|
jless | JSON/CSV 的交互式分页查看器,支持折叠展开、搜索、跳转列,类似 vim 的操作方式 | jless data.json;jless --csv data.csv;cat x.json | jless(管道输入) |
fx | 交互式 JSON 查看器,支持用 JS 表达式实时查询过滤 | fx data.json;cat x.json | fx '.items[0].name'(也可当 CLI 用) |
visidata | 终端里的电子表格,能打开 CSV/JSON/Excel/SQLite,支持列操作、聚合、透视,功能极强 | visidata data.csv(命令也可简写为 vd);vd data.json;vd --play keys.yml(录制回放操作) |
visidata是那种"用一次就回不去"的工具:打开一个 CSV,Shift+F做透视表、+做聚合、|按正则选行,然后Ctrl+S导出。处理几万行的表格数据,比写 Python 脚本快,也比直接awk直观。
四、CSV 工具箱
csvkit 是一套遵循 Unix 哲学的 CSV 命令行工具集——每个命令只做一件事,用管道组合。它的价值在于正确处理 CSV 的边界情况:带引号的字段、字段内嵌逗号和换行、不同的分隔符和编码,这些都是 cut/awk 容易出错的地方。
| 命令 | 作用 | 常用示例 |
|---|---|---|
csvlook | 把 CSV 渲染成对齐的表格,人眼可读地预览 | csvlook data.csv;head -5 big.csv | csvlook(先看几行) |
csvcut | 按名称或序号取列,等价于 cut 但理解 CSV 引号与表头 | csvcut -n data.csv(列出列名);csvcut -c name,age data.csv(取列);csvcut -C id data.csv(排除列) |
csvstat | 输出每列的统计摘要:类型、空值数、最大最小、均值、常见值 | csvstat data.csv;csvstat --max data.csv(只看最大值) |
csvgrep | 按条件过滤行,支持正则匹配 | csvgrep -c status -m ACTIVE data.csv;csvgrep -c name -r "^A" data.csv(正则) |
csvsql | 对 CSV 直接跑 SQL,或生成建表语句 | csvsql --query "select name, count(*) from data group by name" data.csv;csvsql --dialect postgresql data.csv(生成 DDL) |
in2csv | 把 Excel、JSON、DBF 等格式转成 CSV,处理别人发来的表格文件很方便 | in2csv data.xlsx > data.csv;in2csv data.json > data.csv;in2csv --sheet "Sheet2" f.xlsx |
五、CSV 高性能处理
csvkit 用 Python 写成,方便但慢;面对几百 MB 的 CSV 就力不从心了。这两个用 Rust/Go 写的替代品专治大文件。
| 命令 | 作用 | 常用示例 |
|---|---|---|
xsv | Rust 写的极速 CSV 工具,索引、切片、连接、统计,处理大文件比 csvkit 快几十倍 | xsv headers data.csv(列名);xsv select name,age data.csv(取列);xsv stats data.csv(统计);xsv slice -s 100 data.csv(切片);xsv join id a.csv id b.csv(连接);xsv index data.csv(建索引加速后续操作) |
mlr | Miller,CSV/JSON 的行列处理工具,语法类似 awk 但理解表头和字段类型,功能非常全面 | mlr --csv cut -f name,age data.csv(取列);mlr --icsv --ojson cat data.csv(CSV 转 JSON);mlr --csv filter '$age > 18' data.csv(过滤);mlr --c2j sort -f age data.csv(排序并转 JSON);mlr --c2p stats1 -a mean -f age data.csv(聚合求均值) |
选择建议:小文件(几 MB 内)用 csvkit,语法符合直觉且输出好看;大文件(几百 MB)用
xsv或mlr,速度差一个量级以上。xsv index建索引后,后续的slice、stats几乎是瞬时的。
六、用 SQL 查询文件
SQL 是表达"筛选、分组、聚合、连接"这类操作最自然的方式。既然这样,为什么还要为 CSV 现学一套工具语法?下面几个命令让你直接用 SQL 查文件。
| 命令 | 作用 | 常用示例 |
|---|---|---|
q | 直接对 CSV/TSV 文件执行 SQL 语句,不用先导入数据库 | q -d, -H "SELECT name, COUNT(*) FROM data.csv GROUP BY name"(-H 表示有表头);q "SELECT * FROM data.csv WHERE age > 18";q -O -d, "SELECT * FROM a.csv"(-O 输出表头) |
sqlite3 | 内嵌数据库,可把 CSV 导入后用完整 SQL 查询,适合多表关联等复杂分析 | sqlite3 :memory: -cmd ".mode csv" -cmd ".import data.csv t" "SELECT name, COUNT(*) FROM t GROUP BY name";sqlite3 db.sqlite ".schema"(看表结构);sqlite3 db.sqlite -csv "SELECT * FROM t"(CSV 输出) |
csvsql | csvkit 组件的 SQL 接口,可直接查询也可生成建表语句 | csvsql --query "SELECT name, COUNT(*) FROM data GROUP BY name" data.csv |
临时分析一个 CSV 最省事的就是
q:q -H -d, "select * from data.csv where status='FAIL'",一行搞定,不用建库导表。如果分析逻辑复杂到要多次联表、建索引,那就老实用sqlite3把数据导进去,后续查询会快得多。
七、XML
XML 在遗留系统和 Java 生态里仍然常见,配置文件(Maven、Spring)、SOAP 接口、各类企业级数据交换都还在用它。
| 命令 | 作用 | 常用示例 |
|---|---|---|
xmllint | XML 解析与校验工具,可做格式美化、XPath 查询、Schema 校验 | xmllint --format f.xml(美化);xmllint --xpath "//book/title/text()" f.xml(XPath 查询);xmllint --schema s.xsd f.xml(校验);xmllint --html --xpath "//a/@href" page.html(HTML 也支持) |
xmllint --format是对付"一整行压缩 XML"的救星——遇到那种几万字符挤在一行的配置文件,先格式化再打开看。XPath 支持让它能精确定位节点,比用 grep 在 XML 里找东西可靠得多。
一句话总结
结构化数据速查:JSON 用 jq(记住过滤器管道模型,复杂逻辑写 .jq 文件),YAML/多格式用 yq/dasel,先看结构再用 jless/fx/visidata,CSV 小文件用 csvkit、大文件用 xsv/mlr,想直接写 SQL 就上 q/sqlite3,XML 交给 xmllint——17 个命令让你不用写脚本就能完成大部分数据清洗与分析。