
为什么终端技能仍然重要
有了精美的 IDE 和 GUI 工具,你可能会想为什么终端技能仍然重要。答案是:速度和力量。一个熟悉终端的开发者可以在 5 秒内完成 GUI 需要 30 秒才能完成的操作。而且许多服务器环境根本没有 GUI。

基本导航
# 智能导航
cd - # 跳转到上一个目录
cd ~ # 家目录
pushd /path # 将目录压入栈并跳转
popd # 弹出栈并返回
# 高效列出
ls -lahF # -l=长格式, -a=隐藏文件, -h=人类可读大小, -F=类型指示符
ls -lt # 按修改时间排序(最新在前)
# 快速查找文件
find . -name "*.ts" -newer package.json # 修改时间晚于 package.json
find . -type f -size +1M # 大于 1MB 的文件
find . -name "*.log" -mtime +7 -delete # 删除 7 天前的日志
文本处理利器
# grep — 搜索文件内容
grep -r "TODO" src/ # 递归搜索
grep -rn "pattern" . # 显示行号
grep -l "pattern" *.ts # 仅显示匹配的文件名
grep -v "pattern" file.txt # 不匹配的行(反向)
# ripgrep (rg) — 更快的 grep
rg "TODO" src/ # 功能相同但更快,尊重 .gitignore
rg "pattern" -t ts # 仅 TypeScript 文件
rg "TODO" --glob "!*.test.ts" # 排除测试文件
# sed — 流编辑器
sed 's/oldtext/newtext/g' file.txt # 在标准输出中替换
sed -i 's/localhost/production.host/g' config.env # 原地编辑
sed -n '10,20p' bigfile.txt # 打印 10-20 行
# awk — 基于列的处理
ps aux | awk '{print $2, $11}' # 打印 PID 和命令
cat data.csv | awk -F',' '{print $1, $3}' # 打印第 1 和第 3 列
awk '/pattern/ {count++} END {print count}' file.txt # 统计匹配行数
# jq — JSON 处理(必备!)
cat data.json | jq '.users[].name' # 提取数组中的名字
cat response.json | jq '.data | length' # 数组长度
curl api.example.com | jq '.[] | select(.active == true)'

进程管理
# 查找和杀死进程
ps aux | grep node # 查找 node 进程
pgrep -f "npm run dev" # 通过命令获取 PID
pkill -f "npm run dev" # 通过命令模式杀死进程
lsof -i :3000 # 什么在使用 3000 端口?
kill -9 $(lsof -ti:3000) # 杀死 3000 端口上的进程
# 后台进程
./server.js & # 后台运行
nohup ./server.js & # 后台运行,退出登录后继续
jobs # 列出后台作业
fg %1 # 将作业 1 调到前台
bg %1 # 在后台恢复作业 1
# 资源监控
top # 实时进程视图
htop # 更好的 top(需单独安装)
iotop # 按进程查看磁盘 I/O
nethogs # 按进程查看网络使用
tmux:终端复用器
tmux 让你在一个 SSH 会话中拥有多个终端,并且断开连接后会话仍然存活:
# 会话管理
tmux new -s myproject # 创建命名会话
tmux attach -t myproject # 重新附加到会话
tmux ls # 列出会话
tmux kill-session -t myproject
# 在 tmux 内部(Ctrl+b 是前缀键)
Ctrl+b c # 新窗口
Ctrl+b n/p # 下一个/上一个窗口
Ctrl+b 1-9 # 按编号切换窗口
Ctrl+b , # 重命名窗口
Ctrl+b % # 垂直分割
Ctrl+b " # 水平分割
Ctrl+b 方向键 # 在窗格间导航
Ctrl+b z # 放大/缩小当前窗格
Ctrl+b d # 分离(会话继续运行!)
# 滚动模式
Ctrl+b [ # 进入滚动模式(按 q 退出)
# ~/.tmux.conf — 有用的配置
set -g mouse on # 启用鼠标
set -g status-style bg=black,fg=white
set -g default-terminal "screen-256color"
# 更好的键绑定
bind | split-window -h # 用 | 代替 % 分割
bind - split-window -v # 用 - 代替 " 分割
bind r source-file ~/.tmux.conf # 重新加载配置

Shell 生产力
# 历史记录快捷键
Ctrl+r # 反向搜索历史
!! # 重复上一条命令
!$ # 上一条命令的最后一个参数
!* # 上一条命令的所有参数
Ctrl+u # 清除当前行
Ctrl+a/e # 跳转到行首/行尾
Alt+b/f # 向后/向前跳转一个单词
# 实用单行命令
# 以 root 身份运行上一条命令
sudo !!
# 快速备份
cp file.txt{,.bak} # 创建 file.txt.bak
# 创建目录并进入
mkdir -p new/nested/dir && cd $_
# 对所有文件执行命令
for f in *.ts; do echo "Processing $f"; done
# 计时命令
time npm run build
fzf:模糊查找器(改变游戏规则)
# 安装
brew install fzf
$(brew --prefix)/opt/fzf/install # 安装键绑定和补全
# 安装后:
Ctrl+r # 模糊搜索命令历史
Ctrl+t # 模糊搜索文件(插入到命令行)
Alt+c # 模糊 cd 进入目录
# 在脚本中使用
file=$(fzf) # 交互式选择文件
process=$(ps aux | fzf | awk '{print $2}')
kill -9 "$process" # 杀死选中的进程
# 预览文件
fzf --preview 'cat {}'
fzf --preview 'bat --color=always {}' # bat = 更漂亮的 cat
# Git 与 fzf
# 模糊切换分支
git checkout $(git branch | fzf)
# 模糊显示提交
git show $(git log --oneline | fzf | awk '{print $1}')
SSH 技巧
# ~/.ssh/config — 避免输入长命令
Host myserver
HostName 192.168.1.100
User deploy
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60 # 防止超时
Host prod-bastion
HostName bastion.example.com
User ec2-user
ForwardAgent yes # 转发 SSH 密钥到远程
Host prod-api
HostName 10.0.0.5 # 私有 IP
User ubuntu
ProxyJump prod-bastion # 通过堡垒机跳转!
# 用法:只需输入:
ssh myserver
ssh prod-api # 自动通过堡垒机跳转
# SSH 隧道
ssh -L 5432:localhost:5432 myserver # 本地访问远程 postgres
ssh -L 8080:internal-host:80 bastion # 访问内部 Web 服务
文件操作
# rsync — 对于大型操作比 cp 更好
rsync -avz --progress source/ dest/ # 同步并显示进度
rsync -avz --exclude="node_modules" src/ user@server:/deploy/
# tar — 归档和压缩
tar czf archive.tar.gz directory/ # 创建
tar xzf archive.tar.gz # 解压
tar tzf archive.tar.gz # 列出内容
# 磁盘使用情况
du -sh * # 当前目录下每个项目的大小
du -sh */ | sort -h # 按大小排序
df -h # 已挂载卷的磁盘空间
ncdu # 交互式磁盘使用(需单独安装)
# 快速文件操作
wc -l file.txt # 统计行数
sort file.txt | uniq -c | sort -rn # 统计出现次数,按频率排序
head/tail -n 20 file.txt # 前/后 20 行
tail -f /var/log/app.log # 实时跟踪日志文件
→ 使用 chmod 计算器 计算 Linux 文件权限。