Debian 文本处理入门:grep、awk 与 sed
在 Debian 服务器上排障,十有八九要先跟日志打交道。日志文件动辄几十万行,靠肉眼翻是不现实的,grep、awk、sed 这三个老工具,基本能覆盖日常九成的文本处理需求。
一、grep:先把相关的行找出来
grep 最常用的姿势就是按关键字过滤,比如在 auth.log 里找失败的登录记录:
grep "Failed password" /var/log/auth.log
加上 -i 忽略大小写,-n 显示行号,-C 3 再带上前后 3 行上下文,定位问题快很多。需要同时满足多个条件时,用 grep "ERROR" app.log | grep "timeout" 这样串联两次过滤,比写复杂正则省事。
二、awk:按列把字段抠出来
日志很多都是按空格或冒号分列的,awk 天生就是干这个的。比如从访问日志里统计每个 IP 出现的次数:
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
$1 是第一列,$NF 是最后一列。想只看状态码是 500 的请求,再加个条件:
awk '$9 == 500 {print $1, $7}' /var/log/nginx/access.log
三、sed:做简单的替换
改配置、批量替换文本时 sed 很顺手。比如把配置文件里的旧域名换成新的:
sed -i 's/old.example.com/new.example.com/g' /etc/nginx/conf.d/site.conf
-i 是直接改文件,操作前建议先 cp 备份一份。只想看看替换效果、不落盘,就去掉 -i。
四、三者串联:一个完整的排障例子
假设某个接口偶尔超时,先 grep 捞出超时记录,再 awk 抽出耗时和接口路径,最后 sed 把时间戳里的 T 换成空格方便阅读:
grep "timeout" /var/log/app.log | awk '{print $2, $5, $9}' | sed 's/T/ /' | sort | uniq -c | sort -nr | head -20
这样一轮下来,哪个接口超时最多、集中在什么时段,基本就清楚了。
小结
grep 负责找行,awk 负责取列,sed 负责改写。三个工具单独用都能解决一类问题,管道串起来就是一条完整的日志分析流水线。平时多在测试日志上练几遍,线上排障时手就不会生。
- 点赞
- 收藏
- 关注作者
评论(0)