分工

工具 强项
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

进阶提示

  • 处理超大文件用 grepawksed 这个顺序,让最快的工具先减少行数
  • 复杂逻辑用脚本写更清楚——awk 也是图灵完备的,但调试不友好
  • Python pandas 比这套工具链强得多——但你不能保证服务器上有 pandas,sed/awk 总在

下一篇:文件传输前先打包——压缩与解压。