引言
命令行是开发者最强大的工具之一。但大多数人对命令行的使用停留在 ls、cd、git 的基础操作上。本文收集了我在日常开发中使用频率最高的命令行技巧,覆盖文件搜索、文本处理、会话管理、远程操作和系统诊断五大类。
一、find:文件搜索终极工具
1.1 按名称和时间搜索
# 按名称搜索(支持通配符)
find . -name "*.go" -type f
# 最近 7 天修改的文件
find . -mtime -7 -type f
# 大于 100MB 的文件
find . -size +100M -type f
# 查找并删除 node_modules 目录
find . -name "node_modules" -type d -prune -exec rm -rf {} \;
1.2 find + exec 组合技
# 查找所有 .log 文件并压缩
find . -name "*.log" -exec gzip {} \;
# 批量修改文件权限
find . -name "*.sh" -exec chmod +x {} \;
# 统计每个目录下的文件数
find . -type d -exec sh -c 'echo -n "{}: "; find "{}" -maxdepth 1 -type f | wc -l' \;
二、grep:文本搜索利器
# 递归搜索(-r),忽略大小写(-i),显示行号(-n)
grep -rin "TODO" src/
# 只显示匹配的文件名
grep -rl "deprecated" .
# 反向匹配(排除某些行)
grep -v "DEBUG" app.log | grep "ERROR"
# 使用正则:匹配函数定义
grep -n "^func.*int64" *.go
# 显示上下文(前后各 3 行)
grep -C 3 "panic" server.log
三、sed:流编辑器
# 替换文件中的内容(macOS 需要 -i '')
sed -i 's/old-text/new-text/g' file.txt
# 删除空行
sed -i '/^$/d' file.txt
# 在第 5 行后插入一行
sed -i '5a\new line content' file.txt
# 只替换第 3 到第 10 行
sed -i '3,10s/foo/bar/g' file.txt
# 删除匹配行
sed -i '/deprecated/d' config.yaml
四、awk:文本处理瑞士军刀
# 打印第 1 和第 3 列
awk '{print $1, $3}' data.txt
# 按分隔符处理(CSV 文件)
awk -F',' '{print $2}' users.csv
# 条件过滤:第 3 列大于 100 的行
awk '$3 > 100' data.txt
# 统计:按第 1 列分组,求和第 3 列
awk '{sum[$1] += $3} END {for (k in sum) print k, sum[k]}' sales.txt
# 分析 Nginx 日志:统计每个 IP 的请求数
awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log \
| sort -k2 -rn | head -10
五、tmux:会话管理
# 创建新会话
tmux new -s dev
# 分离会话(detach):Ctrl+B, D
# 重新连接
tmux attach -t dev
# 列出所有会话
tmux ls
# 水平分屏:Ctrl+B, "
# 垂直分屏:Ctrl+B, %
# 切换窗格:Ctrl+B, 方向键
# 实用配置 (~/.tmux.conf)
set -g mouse on # 启用鼠标支持
set -g history-limit 10000
set -g base-index 1 # 窗格编号从 1 开始
六、rsync:文件同步
# 本地同步(-a 归档模式,-v 详细输出,-z 压缩传输)
rsync -avz /source/ /destination/
# 远程同步到服务器
rsync -avz -e "ssh -p 22" ./dist/ user@server:/var/www/app/
# 排除 node_modules 和 .git
rsync -avz --exclude='node_modules' --exclude='.git' ./ user@server:/app/
# 干运行(不实际同步,只显示会做什么)
rsync -avzn ./dist/ user@server:/var/www/app/
七、SSH 配置与隧道
# ~/.ssh/config 配置示例
Host prod
HostName 10.0.1.100
User deploy
Port 22
IdentityFile ~/.ssh/id_rsa_prod
Host jump
HostName jump.example.com
User admin
# 通过跳板机连接(SSH 隧道)
ssh -J jump prod
# 端口转发:本地 8080 映射到远程 80
ssh -L 8080:localhost:80 user@server
# 反向隧道:远程 9090 映射到本地 3000
ssh -R 9090:localhost:3000 user@server
八、systemd 服务管理
# 查看服务状态
systemctl status nginx
# 启动/停止/重启
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
# 开机自启
systemctl enable nginx
# 查看服务日志
journalctl -u nginx -f # -f 实时跟踪
journalctl -u nginx --since "1 hour ago"
# 自定义服务文件 /etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
User=app
WorkingDirectory=/opt/myapp
ExecStart=/opt/myapp/bin/server
Restart=on-failure
[Install]
WantedBy=multi-user.target
九、Cron 定时任务
# 编辑当前用户的 crontab
crontab -e
# 格式:分 时 日 月 周 命令
# 每天凌晨 2 点备份数据库
0 2 * * * /opt/scripts/backup.sh
# 每 5 分钟执行一次健康检查
*/5 * * * * /opt/scripts/healthcheck.sh
# 每周一早上 8 点发送报告
0 8 * * 1 /opt/scripts/weekly-report.sh
# 查看 crontab 日志
grep CRON /var/log/syslog
十、磁盘与网络诊断
# 磁盘使用情况
df -h # 磁盘分区使用
du -sh * # 当前目录下每个文件/文件夹大小
du -sh * | sort -rh | head -10 # 最大的 10 个
# 网络诊断
ss -tlnp # 查看监听端口
lsof -i :8080 # 查看占用 8080 端口的进程
curl -w "\n%{time_total}\n" -o /dev/null -s https://example.com # 请求耗时
mtr google.com # 路由追踪 + 实时延迟统计
# 进程管理
htop # 交互式进程查看器
ps aux --sort=-%mem | head -10 # 内存占用前 10 的进程
kill -9 $(lsof -ti:3000) # 杀掉占用 3000 端口的进程
总结
命令行的效率来自肌肉记忆。不需要记住所有命令,但要知道每个工具的"形状":find 负责搜索文件,grep 负责搜索内容,sed 负责修改文本,awk 负责处理结构化数据,tmux 负责会话管理,rsync 负责文件同步,systemd 负责服务管理。把这些工具的核心用法练熟,你的终端操作效率会提升一个量级。
返回文章列表
标签:Linux命令行Shell