termsql
将任意文本文件或stdin流实时转换为SQLite表,用SQL语言在命令行中完成数据查询与分析
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
将任意文本文件或stdin流实时转换为SQLite表,用SQL语言在命令行中完成数据查询与分析
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
凌晨两点,你的服务器正跑着一份日志文件。运维同事扔给你一句需求:「把 CPU 占用超过 25% 的进程揪出来,按用户分组,看看谁占得最多。」
你下意识打开编辑器,准备写一个 awk/sed/grep 管道,然后发现日志格式是混合分隔符、有些字段带空格、还要分组统计……几分钟后,你的命令变成了:
ps aux | awk '{print $1, $2, $11, $3}' | sort | uniq -c | sort -rn
但这还不够——你还需要 JOIN 两张表、按条件筛选。awk 在这里显得力不从心,而启动一个 Python 脚本又太重。
termsql 正是为这类场景而生的瑞士军刀。它的核心理念简单到令人惊讶:把任何文本文件(或 stdin 流)直接转成 SQLite 内存表,然后用你最熟悉的 SQL 语言去查询。
termsql 诞生于 2014 年,作者是德国开发者 Tobias Glaesser(GitHub ID: tobimensch)。彼时,数据处理 CLI 工具的主流是 awk、sed、cut、sort、uniq 这套 Unix 哲学组合,但随着 SQL 在开发者群体中的高普及率,很多人发现:与其记住 awk 的列引用语法 $1、$NF,不如直接用 SELECT col_name WHERE condition 来得直观。
termsql 的诞生并非偶然。同一时期,命令行友好型数据库工具(如 sqlite3 CLI)已经成熟,而 sqlparse 库的出现让解析 SQL 语句变得更简单。Glaesser 将这三者串联起来:文本输入 → SQLite 内存表 → SQL 查询 → 多格式输出,形成了一个完整的数据转换管道。
项目目前保持维护,MIT 许可证,代码量精简(约 26KB 主脚本),是研究小型 CLI 工具架构的绝佳参考。
termsql 支持两种输入模式:文件读取和 stdin 管道。对于管道场景,termsql 在数据到达时立即开始解析,无需等待完整文件下载完毕,这对于处理大日志流或远程命令输出极为高效。
# 从文件读取(第一行作为列名)
termsql -i server_log.csv -1 "SELECT user, COUNT(*) FROM tbl GROUP BY user"
# 从管道读取(实时流处理)
top -b | head | termsql -1 "SELECT PID,USER,%CPU FROM tbl WHERE %CPU>=25"
termsql 在分隔符处理上展现了极大的灵活性。它支持自定义字面分隔符(-d)、正则分隔符(-g)、CSV 标准解析(--csv,自动处理引号和转义),以及行转列模式(-l n,每 n 行合并为一列)。
自动类型推断也是其亮点:termsql 会检测每列数据,自动创建 INTEGER、REAL(浮点)或 TEXT 列类型,使得后续的数值比较和聚合操作无需手动 CAST。
除标准 list(管道分隔)输出外,termsql 支持以下输出模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
csv | CSV 格式 | 导出给 Excel/Sheets |
column | 列对齐格式 | 终端阅读 |
html | HTML 表格 | 嵌入网页或报告 |
insert | SQL INSERT 语句 | 迁移数据 |
line | 每行 key=value | 结构化日志 |
tabs | Tab 分隔 | 兼容某些数据工具 |
这意味着 termsql 不仅仅是"查询工具",还是一个数据格式转换器,可以在不同格式之间无缝转换。
termsql 还支持原地编辑(-e),可以直接修改配置文件内容。例如,用 SQL UPDATE 语句修改 INI 风格的配置:
termsql -ei .config/app.conf -d '=' -x "UPDATE tbl SET value='true' WHERE key='fMinimizeToTray'"
termsql 采用单文件脚本架构,主文件 termsql 仅约 26KB,包含所有核心逻辑。辅助工具 select、where、limit、orderby、groupby 作为独立脚本提供,遵循 Unix 哲学的工具组合原则。
核心依赖仅有两个:Python 标准库(sqlite3、argparse、fileinput、subprocess、re)和可选的 sqlparse(用于语法优化)。
主脚本定义了以下核心函数:
shell() — 执行 SQL 并格式化结果输出get_col_name() — 从首行或参数获取列名get_col_type() — 自动推断列类型(int/float/text)update_col_properties() — 维护列元数据build_insert() — 构建 SQL INSERT 语句traverse_input() — 遍历输入流,逐行解析并写入临时数据库to_temp_file() / remove_temp_file() — 临时文件管理termsql 的参数设计体现了渐进式复杂度原则:简单任务一行搞定,高级功能通过参数解锁。核心参数包括:
-1:将首行作为列名(避免手动指定 -c)-d:自定义分隔符-m:指定 SQLite 输出模式-r:列合并(处理含空格的文件名)-o:指定输出数据库文件(默认临时文件,程序结束自动清理)-a:追加模式(不清空已有表)-x:自动追加 SELECT * FROM tbl(简化查询语法)awk 是 Unix 管道处理的经典方案,优势在于流式处理和模式匹配能力。但 termsql 的 SQL 查询在多表 JOIN、聚合统计(GROUP BY、HAVING)和子查询方面更加强大。对于习惯 SQL 的开发者,termsql 的学习曲线几乎为零。
# awk:按用户统计进程数
ps aux | awk '{count[$1]++} END{for(u in count) print u, count[u]}'
# termsql:同样的结果,SQL 语义更清晰
ps aux | termsql -m line -1 "SELECT USER,COUNT(*) FROM tbl GROUP BY USER"
q 是另一个将文本转为 SQL 查询的流行工具(Julian Sanhorwitz 开发)。两者功能高度重叠,但 termsql 在输出格式多样性(9种输出模式)和原地编辑能力上更胜一筹,而 q 在 CSV 解析的标准化程度上略好。
termsql 是典型的零门槛部署工具:
# 方式一:pip 安装(推荐)
pip3 install termsql
# 方式二:手动安装
sudo python setup.py install
依赖仅有两个:Python >= 3.6(主环境)和 sqlite3(Python 标准库自带)。sqlparse 为可选依赖,用于更简洁的 SQL 语句写法。
资源占用极低:运行时内存约 256KB,磁盘占用 < 10MB,无 GPU 要求。
termsql 并非银弹。以下场景下表现受限:
grep 预过滤,再用 termsql 查询。termsql 代表了一种极简主义工具设计哲学:不造轮子,复用成熟技术(SQLite),聚焦单一场景(文本→SQL),做到极致。在 AI 和大数据时代,SQL 依然是数据工作者最熟悉的语言。termsql 让这个语言在任何终端、任何管道场景中都能发挥作用。
从增长曲线看,termsql 近年来持续稳定在 280-285 stars,虽无爆发式增长,但项目成熟度高、用户粘性强,是一个典型的「默默服务」型工具。
一句话总结:termsql 把 SQL 的表达力带入了每一个 Linux 管道,让文本数据处理变成了即时的交互式数据库查询。对于需要频繁处理日志、CSV、配置文件的开发者,这是一个用过就离不开的效率工具。