Linux 命令行入门:grep、sed、awk 三个命令的实用组合

举报
yd_226289576 发表于 2026/11/08 06:05:05 2026/11/08
【摘要】 刚接触 Linux 时,很多人只会 ls、cd、cat,遇到日志排查就束手无策。其实只要掌握 grep、sed、awk 这三个命令,再把它们用管道串起来,日常的文本处理基本够用。下面用一个真实场景串起它们:分析 Nginx 访问日志 access.log。 一、grep:先把相关的行找出来grep 是过滤器,默认按行匹配。查所有 404 请求:grep " 404 " access.log常...

刚接触 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 备份再动手。

建议把上面每条命令都亲手敲一遍:先拿一个几十行的测试日志练手,确认每一步的输出符合预期,再用到真实日志上。工具不在多,顺手才是本事。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。