深色模式
文本三剑客 grep/sed/awk
摘要:运维 80% 的时间在处理文本。grep 找行、sed 改行、awk 拆列,三者配合能解决绝大多数日志与配置处理问题。
一、grep:按内容过滤行
bash
grep "ERROR" app.log # 含 ERROR 的行
grep -i "error" app.log # 忽略大小写
grep -v "INFO" app.log # 反向:排除 INFO
grep -n "timeout" app.log # 显示行号
grep -r "port" /etc/ # 递归搜目录下文件
grep -E "404|500" access.log # 扩展正则(或 egrep)1
2
3
4
5
6
2
3
4
5
6
二、sed:流式替换/删除
bash
sed 's/old/new/' app.conf # 替换每行第一个 old
sed 's/old/new/g' app.conf # 替换所有
sed -i 's/80/8080/' app.conf # 直接改文件(-i 危险,先备份)
sed -i.bak 's/80/8080/' app.conf # 改前自动备份为 .bak
sed -n '10,20p' app.log # 打印 10-20 行1
2
3
4
5
2
3
4
5
三、awk:按列提取与统计
bash
awk '{print $1}' access.log # 打印第一列
awk '{print $1, $4}' access.log # 打印第 1、4 列
awk -F: '{print $1}' /etc/passwd # 以 : 为分隔符
awk '{sum+=$1} END{print sum}' nums.txt # 求和
awk '$9==500' access.log # 筛选第 9 列等于 500 的行1
2
3
4
5
2
3
4
5
实战:统计 5xx 错误数
bash
grep -E '" (500|502|503|504) ' access.log | wc -l
# 或用 awk 直接数第 9 列为 5xx 的行
awk '$9 ~ /^5[0-9][0-9]$/' access.log | wc -l1
2
3
2
3
组合拳
管道 | 把它们串起来:grep ERROR app.log | awk '{print $1}' | sort | uniq -c | sort -rn 可统计各 IP 的报错次数。
验证
- [ ]
grep -i能忽略大小写过滤 - [ ]
sed -i.bak改文件前有备份 - [ ]
awk '{print $1}'正确提取第一列
常见坑
- sed -i 误改:先不加
-i在屏幕看结果,确认后再加。 - awk 列号从 1 开始:不是 0。
- 空格 vs 制表符:
awk默认以空白分隔,多空格也能切。