Linux 命令行入门:grep、sed、awk 三个命令的实用组合
刚接触 Linux 时,很多人只会 ls、cd、cat,遇到日志排查就束手无策。其实只要掌握 grep、sed、awk 这三个命令,再把它们用管道串起来,日常的文本处理基本够用。下面用一个真实场景串起它们:分析 Nginx 访问日志 access.log。
一、grep:先把相关的行找出来
grep 是过滤器,默认按行匹配。查所有 404 请求:
grep " 404 " access.log
常用选项要记牢:-i 忽略大小写,-n 显示行号,-v 反向排除,-r 递归查目录,-E 用扩展正则。比如先排除健康检查的干扰,再找 5xx 报错:
grep -v "health" access.log | grep -E " 50[0-9] "
注意引号:模式里有空格或特殊字符时一定要加引号,否则 shell 会先拆分,查出来的结果就不对了。
二、awk:按列取值和统计
awk 把每一行按空白切成 $1、$2……等字段,适合处理结构化的日志。统计访问量前 10 的 IP:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
统计各状态码的数量:
awk '{print $9}' access.log | sort | uniq -c | sort -nr
不同日志格式的字段位置不同,先用 head -1 看一眼再定列号,别硬背。awk 还能做简单求和,比如把所有响应字节数加起来:
awk '{sum+=$10} END {print sum}' access.log
三、sed:批量改写文本
sed 适合做流式替换。把日志里的内网 IP 统一脱敏:
sed -i 's/192\.168\.1\.[0-9]\+/192.168.1.x/g' access.log
-i 是直接改文件,操作前务必先备份。只替换前 10 行,或者只对匹配的行替换:
sed '1,10s/error/warning/' app.log
sed '/404/s/GET/POST/' access.log
正则里的点号要转义,替换部分的 & 代表整个匹配内容。
四、三个命令串起来的实战
一个完整例子:找出今天访问量最大的 5 个接口:
grep "$(date +%d/%b/%Y)" access.log | awk '{print $7}' | sort | uniq -c | sort -nr | head -5
再进一步,对某个慢接口单独看耗时分布(假设第 10 列是耗时毫秒):
grep "/api/orders" access.log | awk '{print $10}' | sort -n | awk '{a[NR]=$1} END {print "中位数约:", a[int(NR/2)]}'
思路固定不变:grep 先过滤、awk 再取列统计、sed 最后改写,三者之间用管道连接,输出再用 sort、uniq、head 收尾。
五、三个容易踩的坑
第一,管道里每一步都可能悄悄丢数据,排查时逐段执行、逐段看行数,别一次写完再猜。第二,awk 的字段编号依赖日志格式,换一台机器、换一个 Nginx 配置都要重新确认。第三,sed -i 没有撤销键,生产日志先 cp 备份再动手。
建议把上面每条命令都亲手敲一遍:先拿一个几十行的测试日志练手,确认每一步的输出符合预期,再用到真实日志上。工具不在多,顺手才是本事。
- 点赞
- 收藏
- 关注作者
评论(0)