Linux 文本处理三剑客:grep、sed、awk 入门
在 Linux 服务器上排查问题,十有八九要和日志文件打交道。日志动辄几万行,靠肉眼翻是不现实的。grep、sed、awk 这三个工具被称为文本处理三剑客,分工明确:grep 负责找,sed 负责改,awk 负责算。掌握它们,查日志的效率能翻几倍。
一、grep:先把相关的行找出来
grep 是最常用的筛选工具,基本用法是在文件里找包含某个关键词的行:
grep "error" app.log
只看包含 error 的行,日志一下子就变薄了。几个日常高频选项值得记住:
-i忽略大小写:grep -i "error" app.log,大小写混写的报错也不会漏掉-n显示行号:grep -n "error" app.log,定位到具体行再用编辑器打开-v反向筛选:grep -v "healthcheck" app.log,把无意义的心跳日志先排除-c只统计数量:grep -c "timeout" app.log,先看报错有多少再决定要不要深挖-r递归查目录:grep -r "password" /etc/nginx/,在整个目录里找配置
组合起来用效果更好。比如先排除干扰、再看真正的报错:
grep -v "healthcheck" app.log | grep -i "error"
二、sed:不用打开文件就能改内容
sed 是流编辑器,最常见的用法是替换文本。把配置文件里一个值批量改掉,不用逐个打开文件:
sed -i 's/8080/9090/g' app.conf
这里 -i 表示直接改文件,s/8080/9090/g 的意思是把每一行的 8080 都换成 9090,g 代表整行全部替换,不加 g 只换每行第一个。
不加 -i 时 sed 只把结果输出到屏幕、不动原文件,改之前先这样预览一次是个好习惯:
sed 's/8080/9090/g' app.conf
除了替换,sed 还能按行号删行、取行。删掉文件前 10 行注释、只看正文:
sed -n '11,20p' app.log
这行命令只打印第 11 到第 20 行,配合管道可以快速截取日志的某一段。
三、awk:按列处理,做统计
日志常常是按列排的,比如访问日志里每一行都有 IP、时间、状态码。awk 按列切分,一行命令就能做统计:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5
这条命令做了五件事:取每行第一列(IP)、排序、去重计数、按次数倒序、取前五名。结果就是访问量最高的五个 IP,一眼看出有没有异常流量。
再比如统计各种状态码各出现了多少次:
awk '{print $9}' access.log | sort | uniq -c
状态码在第九列,$9 就是取第九列。200 有多少、404 有多少、500 有多少,一行命令全出来了,比写脚本快得多。
四、三剑客怎么配合
实际排查很少只用一个工具,典型流程是三步走:
grep先筛出含关键词的行,缩小范围sed按行号截取可疑时间段awk按列统计,找出规律
比如接口突然变慢,先找慢请求:
grep "slow" app.log | awk '{print $4}' | sort | uniq -c
先筛出慢请求,再按第四列(接口名)统计,哪个接口慢得最多立刻现形。定位到接口之后,再用 sed 截取对应时间段的完整日志交给开发。
五、几个新手容易踩的坑
sed -i会直接改文件,改重要配置前先备份一份,cp app.conf app.conf.bak再动手grep默认是区分大小写的,查报错记得加-i,不然Error和error会漏一半awk的列号从 1 开始,$0代表整行,别把$1和第一列搞混- 管道接得越长越要分段验证,每接一段先看一眼输出对不对,再往下接
小结
grep 找行、sed 改行、awk 按列统计。三个工具都不难,难的是养成组合使用的习惯:先筛、再截、后统计。日志排查的大部分工作,一条管道命令就能完成。下次服务器出问题,别急着翻文件,先想想哪条管道能把答案直接算出来。
- 点赞
- 收藏
- 关注作者
评论(0)