分工
| 工具 | 强项 |
|---|---|
| grep | 找匹配的行 |
| sed | 流式替换 / 删除 / 插入 |
| awk | 按列处理 / 计算 / 报表 |
三者经常配合用。
sed:流式编辑器
# 替换(默认每行第一个匹配)
sed 's/old/new/' file.txt
# 替换所有(g = global)
sed 's/old/new/g' file.txt
# 原地修改文件(-i)
sed -i 's/old/new/g' file.txt
# 删除行
sed '5d' file.txt # 删第 5 行
sed '/ERROR/d' file.txt # 删含 ERROR 的行
sed '/^$/d' file.txt # 删空行
# 打印特定行
sed -n '10,20p' file.txt # 第 10-20 行
sed -n '/start/,/end/p' f.txt # 从 start 到 end
# 在某行后插入
sed '5a\新内容' file.txt # 在第 5 行后加一行
# 多个操作
sed -e 's/foo/FOO/g' -e 's/bar/BAR/g' file.txt
⚠ sed -i 是危险操作——直接改文件,没回滚。先在小文件上试,或加 -i.bak 自动备份。
sed -i.bak 's/old/new/g' big.conf
# 改完后产生 big.conf.bak 备份
awk:按列处理 + 简单脚本
awk 把每行按空格 / Tab 自动切分成 $1 $2 $3 ... 列。
# 打印第 2 列
awk '{print $2}' file.txt
# 打印第 1 和 3 列
awk '{print $1, $3}' file.txt
# 用逗号作为分隔符
awk -F',' '{print $2}' data.csv
# 条件过滤
awk '$3 > 100' data.txt # 第 3 列 > 100 的行
awk '/ERROR/ {print $1}' log # 含 ERROR 的行打印第 1 列
# 计算
awk '{sum += $1} END {print sum}' nums.txt # 求和
awk '{count++} END {print count}' file.txt # 行数
awk '{sum += $1} END {print sum/NR}' nums.txt # 平均值
实战组合
1. 看 Nginx 日志中每个 IP 的请求数
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
拆解:
awk '{print $1}'提取第 1 列(IP)sort排序(uniq 需要相同行连续)uniq -c去重 + 计数sort -rn按数字倒序head -10取前 10
2. 批量改配置
# 把所有 .conf 里的 localhost 改成 0.0.0.0
sed -i.bak 's/localhost/0.0.0.0/g' *.conf
3. 找每个用户的家目录大小
# /etc/passwd 第 6 列是家目录
awk -F: '{print $6}' /etc/passwd | xargs -I{} du -sh {} 2>/dev/null
4. CSV 求平均
# data.csv: name,score
awk -F, 'NR>1 {sum+=$2; n++} END {print sum/n}' data.csv
进阶提示
- 处理超大文件用
grep→awk→sed这个顺序,让最快的工具先减少行数 - 复杂逻辑用脚本写更清楚——awk 也是图灵完备的,但调试不友好
- Python
pandas比这套工具链强得多——但你不能保证服务器上有 pandas,sed/awk 总在
下一篇:文件传输前先打包——压缩与解压。