工具不是越多越好。这篇文章的定位不是”工具大全”,而是按场景给出推荐:遇到这类问题,该用什么。每个工具用一段说清楚它解决什么问题、核心用法是什么、什么时候不该用它——不做参数手册。
1. 选工具的基准
换工具有三个理由:更快(Rust/Go 重写,利用多核并行,比经典工具快 10-100 倍)、默认值更好(自动尊重 .gitignore、彩色输出、更清晰的错误信息)、填了空白(经典 Unix 工具集里根本没有的能力,比如模糊搜索、终端复用、JSON 处理)。
不换的理由:脚本里需要稳定可预期的输出,用 cat、grep、find——它们跨平台、无依赖、行为一致。bat 的语法高亮和行号会污染管道;rg 默认跳过 .gitignore 忽略的文件,有时恰好是你要找的。
2. 替换关系速查
| 经典工具 | 现代替代 | 核心优势 |
|---|---|---|
grep -r | rg(ripgrep) | 10-100x 更快,自动忽略 .gitignore 和二进制文件 |
find | fd | 语法简洁,彩色输出,默认模糊匹配 |
cat | bat | 语法高亮、行号、Git 变更标记 |
cd | z(zoxide) | frecency 算法,关键词跳转常用目录 |
git diff | delta | 语法高亮、行级对比、侧边栏显示 |
tar/unzip/7z | ouch | 一个命令覆盖所有压缩格式 |
ls + Finder | yazi | Vim 键位 TUI,三栏浏览 + 预览 |
top | glances / htop | 全景监控 / 交互式进程管理 |
| —(无对应) | fzf | 模糊搜索,任何列表的交互式过滤器 |
| —(无对应) | jq | JSON 路径表达式,管道友好 |
| —(无对应) | tmux / zellij | 终端复用,会话保持,分屏 |
3. 搜索与查找
ripgrep(rg) 是代码搜索的首选。速度快、自动跳过 .gitignore 和 node_modules,默认显示行号和彩色输出。
rg handleError # 递归搜索(默认)
rg -l "TODO" # 只列出文件名
rg -C 3 "panic!" # 上下各 3 行上下文
rg -t js "useState" # 只搜 .js 文件
rg -i "error" /var/log/ # 忽略大小写grep 的大多数参数 rg 都支持,迁移成本几乎为零。排查”为什么搜不到”时,先检查是否被 .gitignore 规则过滤——加 --no-ignore 可以绕过。
fd 是文件查找的首选。fd config 找名称包含 “config” 的文件,比 find . -name "*config*" 短得多。
fd config # 模糊匹配文件名
fd -e yaml # 按扩展名查找
fd -t d src # 只找目录
fd -e py -x wc -l # 对每个结果执行命令4. 交互选择
fzf 是模糊搜索的通用接口——它不关心数据来自哪里,只负责让你从列表里快速筛选一项。三种接入方式覆盖了大多数场景:
管道模式:任何列表都能接 fzf。
fd | fzf # 交互式选文件
fd | fzf --preview "bat --color=always {}" # 带预览窗口
git branch | fzf | xargs git checkout # 交互式切分支Ctrl+R:安装 fzf 后,历史命令搜索变成模糊匹配——输入关键词,fzf 从全部历史里过滤,不再靠前缀匹配。
Ctrl+T:交互式选择文件路径并插入到当前命令行。
fzf 在 CI 和脚本里不适用(需要 TTY),但交互式工作流里几乎无处不在。
5. 查看与对比
bat 是查看代码文件的首选——语法高亮 + 行号 + Git 变更标记,比 cat 读起来省力。
bat src/main.rs # 语法高亮 + 行号
bat -A config.yaml # 显示不可打印字符(排查 BOM、Tab/Space)脚本里仍用 cat:bat 的装饰性输出会破坏管道。bat --plain 或 bat -p 输出裸文本,但不如直接用 cat 干净。
delta 让 git diff 可读。在 ~/.gitconfig 里配置一次,之后所有 git diff/show/log -p 自动使用:
[core]
pager = delta
[delta]
navigate = true # n/N 在变更块间跳转
line-numbers = true
side-by-side = true # 左右对比视图6. 导航
zoxide 用 frecency 算法(频率 × 新近度)记忆你去过的目录,让你用关键词跳转:
# 初始化(加到 shell 配置里)
eval "$(zoxide init zsh)"
z proj # 跳到包含 "proj" 的最常用目录
z back api # 精确一点:同时包含 "back" 和 "api"
zi # 交互式选择(结合 fzf)在 ~/work/backend、~/work/frontend、~/personal/blog 之间来回时,z back、z front、z blog 比 cd ~/work/backend 快得多。
7. 终端复用
终端复用器解决两个问题:会话保持(SSH 断开后进程继续运行)和多任务并行(同一终端窗口分屏同时看日志、写代码、跑测试)。
tmux vs zellij 的选择:
| tmux | zellij | |
|---|---|---|
| 学习曲线 | 需要记快捷键(Prefix + 功能键) | 状态栏实时提示,自发现 |
| SSH 远程 | 成熟稳定,会话持久化(resurrect 插件) | 功能够用,生态较新 |
| 布局系统 | 手动分割 | KDL 声明式,可版本化 |
| 适合场景 | 服务器 SSH、长期稳定工作流 | 本地开发、新手友好 |
推荐:本地开发用 zellij,SSH 到服务器用 tmux。两者可以共存。
tmux 核心工作流:
tmux new -s dev # 创建名为 dev 的会话
tmux ls # 列出所有会话
tmux attach -t dev # 重新连接到会话
# 在 tmux 内:Prefix + d 分离(会话继续运行)
# 在 tmux 内:Prefix + c 新建窗口
# 在 tmux 内:Prefix + | 垂直分屏(需自定义配置)SSH 断线不影响 tmux 会话,重连后 tmux attach 恢复现场——这是在服务器上跑长任务时的标准做法。
8. 文件操作
yazi 是终端文件管理器,三栏视图(父目录 / 当前 / 预览),Vim 键位,内置预览(文本高亮 / 图片 / PDF 首页)。适合在目录结构里探索,找到文件后用 $EDITOR 直接打开。
# 退出后 cd 到所在位置(加到 shell 配置里)
function y() {
local tmp="$(mktemp -t yazi-cwd.XXXXXX)"
yazi "$@" --cwd-file="$tmp"
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
cd -- "$cwd"
fi
rm -f -- "$tmp"
}ouch 解决”压缩格式太多、命令各不相同”的问题——一个命令覆盖所有格式:
ouch d archive.tar.gz # 解压(自动识别格式)
ouch d archive.zip
ouch c src/ output.tar.zst # 压缩(根据扩展名选格式)
ouch l archive.tar.gz # 查看内容(不解压)zstd(.zst)是目前压缩率和速度平衡最好的算法,备份和传输优先考虑。
watchexec 监听文件变化并自动执行命令,解决”改了代码要手动跑测试”的循环:
watchexec -e py -- pytest # .py 文件变化时跑测试
watchexec -e rs -- cargo check # Rust 保存即检查
watchexec --restart "pnpm dev" # 服务器模式(重启而非叠加)watchexec 比语言专属工具(nodemon、cargo-watch)更通用——可以跑任何命令。
glow 在终端里渲染 Markdown,让 README 和文档可读而不是 cat 的原始文本:
glow README.md # 渲染
glow -p README.md # 分页模式(类似 less)
glow docs/ # 目录里所有 md 文件的 TUI 列表bat 和 glow 是互补的:bat 看代码文件(行号 + 语法高亮),glow 读文档文件(Markdown 格式渲染)。
9. 数据处理
数据格式决定工具选择:
JSON → jq
YAML / TOML → yq
CSV 小文件 → miller (mlr)
CSV 大文件(>100MB) → xsv
不确定格式 / 先看看 → visidata (vd)jq 是 JSON 处理的标准工具,掌握三个操作覆盖 80% 场景:.key 提取字段、.[] 展开数组、select() 条件过滤:
curl -s api/users | jq '.[].name'
curl -s api/issues | jq '.[] | select(.state == "open") | .title'yq 是 YAML/TOML/JSON 的 jq,语法高度兼容,还支持原地修改(-i):
yq '.services.web.image' docker-compose.yml
yq -i '.version = "2.0.0"' Chart.yaml # 直接写文件,重要配置先备份
yq -o json config.yaml # YAML → JSONmiller(mlr) 是命令行版的 awk + SQL,适合表格数据的过滤、聚合、格式转换——而且结果可复现:
mlr --csv filter '$age > 30' data.csv
mlr --csv stats1 -a mean -f salary -g department data.csv # 按部门统计均值
mlr --icsv --ojson cat data.csv # CSV → JSONxsv 用 Rust 实现,处理 GB 级 CSV 极快,适合简单列操作:
xsv headers large.csv # 看列名
xsv stats large.csv # 统计摘要
xsv frequency -s status large.csv # 列值频率visidata(vd) 是终端里的表格软件,拿到陌生数据先 vd 看结构——CSV、JSON、SQLite、Excel 都能打开。确认字段后再写 mlr/xsv 的精确查询。
10. GUI 工具
“工具箱”不只是命令行。有些场景 GUI 工具更高效:
API 测试:Bruno(开源,请求存储为文件可进 Git)、Hoppscotch(Web 版,协作友好)。Postman 功能最全但越来越重,Bruno 是轻量替代。
数据库:TablePlus(macOS/Windows,支持 PG/MySQL/SQLite/Redis,界面简洁)、DBeaver(开源,全平台,支持几乎所有数据库)。
HTTP 流量调试:Proxyman(macOS,HTTPS 解密流畅,App Store 有免费版)、Charles Proxy(跨平台,老牌工具)。移动端 API 调试必备。
终端模拟器:Ghostty(GPU 渲染,极快,配置简洁)、WezTerm(Lua 配置,跨平台,内置多路复用)、iTerm2(macOS 老牌,功能最全)。
11. 工具进 dotfiles 才算资产
装了工具但没有配置它,下次换机器或者新环境里就不能用,等于工具没有真正拥有。
把这些放进 dotfiles:
- shell alias(
alias cat='bat'、alias grep='rg'、function y() {...}) - 工具初始化(
eval "$(zoxide init zsh)"、fzf 的 shell 集成) - delta 的
.gitconfig配置 - tmux 的
.tmux.conf或 zellij 的 layout 文件 - justfile 的全局 recipe
用 chezmoi 或类似工具管理 dotfiles(见 Dotfiles 管理),工具配置才能跟着你走,而不是每次重新装机都要重建。