输入关键词开始搜索

Linux Shell 速查 — grep/sed/awk/find/系统管理

grep — 文本搜索

grep "error" app.log                  # 搜索包含 error 的行
grep -i "error" app.log               # 忽略大小写
grep -v "debug" app.log               # 排除匹配行
grep -r "TODO" src/                   # 递归搜索目录
grep -n "error" app.log               # 显示行号
grep -c "error" app.log               # 计数
grep -A 3 "error" app.log             # 匹配行 + 后 3 行
grep -B 2 "error" app.log             # 匹配行 + 前 2 行
grep -E "error|fail" app.log          # 正则(扩展)

# 实用组合
grep -rn "FIXME" --include="*.cpp" .  # 只搜 .cpp 文件的 FIXME
ps aux | grep nginx | grep -v grep    # 查进程排除 grep 自身
history | grep "docker"               # 搜索历史命令

find — 文件查找

find . -name "*.cpp"                  # 按名称
find . -name "*.cpp" -o -name "*.h"   # 或逻辑
find . -type f -mtime -7              # 最近 7 天修改的文件
find . -type f -size +10M             # 大于 10MB 的文件
find . -name "*.o" -delete            # 查找并删除
find . -name "*.log" -exec rm {} \;   # 对每个结果执行命令
find . -name "*.cpp" | xargs wc -l    # 管道传递给 wc

# 排除目录
find . -name "*.cpp" -not -path "./build/*"

sed — 流编辑器

# 替换(最常用)
sed 's/old/new/' file                 # 每行替换第一个
sed 's/old/new/g' file                # 全局替换
sed -i 's/old/new/g' file             # 原地修改(-i)

# 按行操作
sed -n '10,20p' file                  # 打印第 10-20 行
sed '5d' file                         # 删除第 5 行
sed '/pattern/d' file                 # 删除匹配行

# 实用场景
sed -i 's/\r$//' file                 # 去除 Windows 换行符
sed -i 's/^#//' config.ini            # 取消注释
sed -n 's/.*PORT=\([0-9]*\).*/\1/p'   # 提取 PORT 值

awk — 文本分析

# 按列处理
awk '{print $1, $3}' file             # 打印第 1、3 列
awk -F: '{print $1}' /etc/passwd      # 指定分隔符 :
awk -F',' '{print $NF}' file          # $NF = 最后一列

# 条件过滤
awk '$3 > 100' data.txt               # 第 3 列 > 100 的行
awk '/error/ {print $0}' app.log      # 含 error 的行
awk 'NR>=10 && NR<=20' file           # 第 10-20 行

# 统计
awk '{sum += $1} END {print sum}'   # 第 1 列求和
awk '{cnt[$2]++} END {for(k in cnt) print k, cnt[k]}' # 分组统计

进程管理

ps aux | grep myapp                   # 查看进程
top -p $(pgrep myapp)                 # 只看指定进程
htop                                  # 更友好的 top

kill -9 <PID>                         # 强杀进程
killall myapp                         # 杀所有同名进程
pkill -f "python server.py"           # 按命令行匹配杀

# 后台运行
nohup ./myapp > output.log 2>&1 &     # 忽略挂断信号
screen -S myapp                       # 创建会话
screen -r myapp                       # 恢复会话
tmux new -s myapp                     # tmux 版

磁盘与文件

df -h                                 # 磁盘使用
du -sh * | sort -h                    # 当前目录各文件/夹大小排序
ncdu                                  # 交互式磁盘分析(需安装)
ls -lhS                               # 按文件大小列出
lsof -p <PID>                         # 进程打开的文件
lsof -i :8080                         # 哪个进程在占用 8080 端口

网络

# 端口/连接
ss -tlnp                              # 监听中的 TCP 端口
ss -tlnp | grep 8080                  # 查 8080 端口
netstat -tlnp                         # 同上(旧工具)

# 连通性
ping -c 4 google.com                  # 4 次 ping
curl -I https://example.com           # 只看 HTTP 头
curl -X POST -d '{"key":"val"}' url   # POST JSON
wget -c https://example.com/file.zip  # 断点续传

# DNS
nslookup example.com                  # 查 DNS
dig example.com +short                # 简洁输出

systemd 服务管理

# 服务状态
systemctl status nginx
systemctl start/stop/restart nginx
systemctl enable nginx               # 开机自启
systemctl disable nginx

# 查看日志
journalctl -u nginx -f               # 跟随日志
journalctl -u nginx --since "1h ago" # 最近 1 小时
journalctl -u nginx -n 50            # 最后 50 行

# 查看启动时间
systemd-analyze                       # 总启动时间
systemd-analyze blame                 # 各服务耗时排序

组合技

# 统计代码行数(排除空行和注释)
find src -name "*.cpp" | xargs cat | grep -v '^\s*$' | grep -v '^\s*//' | wc -l

# 查找最大的 10 个文件
find . -type f -exec du -h {} + | sort -rh | head -10

# 实时监控日志中的错误
tail -f app.log | grep --color "ERROR\|FATAL"

# 批量重命名
for f in *.txt; do mv "$f" "${f%.txt}.md"; done

# 杀掉占用某端口的进程
kill $(lsof -t -i:8080)