Linux 文本处理三剑客:grep、sed、awk 入门实战

举报
yd_248904582 发表于 2026/11/11 06:06:07 2026/11/11
【摘要】 grep 找行、sed 改行、awk 算列:用访问日志做例子,快速上手 Linux 文本处理三剑客的常用命令与组合实战。

在 Linux 服务器上排查问题时,大部分时间都在和文本日志打交道。grep、sed、awk 常被称为“文本处理三剑客”,它们各有分工:grep 负责找,sed 负责改,awk 负责算。把三者组合起来,几行命令就能完成过去需要写脚本才能做的事。本文用一个常见的访问日志 access.log 做例子,带你快速上手。

一、grep:先把目标行找出来

grep 最常用的就是按关键字过滤,再配合 -n 显示行号、-i 忽略大小写、-v 反向排除、-c 只统计行数。

# 找出所有 500 错误
 grep " 500 " access.log
# 忽略大小写查找 error,并显示行号
grep -in "error" app.log
# 统计出现次数,排除健康检查请求
grep -c "GET /health" access.log
grep -v "health" access.log | grep " 404 "

先用 grep 把范围缩小,后面的命令处理的数据就少得多,这是最实用的提速习惯。

二、sed:批量替换与按行处理

sed 是流编辑器,适合批量替换、删除行和提取指定行。注意 -i 会直接修改原文件,操作前最好先备份。

# 把配置文件里的 127.0.0.1 换成内网地址(先备份)
cp nginx.conf nginx.conf.bak
sed -i 's/127.0.0.1/192.168.1.10/g' nginx.conf
# 只打印第 10 到 20 行
sed -n '10,20p' access.log
# 删除空行和以 # 开头的注释行
sed -e '/^$/d' -e '/^#/d' config.txt

sed 的替换语法是 s/旧内容/新内容/g,g 表示一行内全部替换,不加 g 只换每行第一个。

三、awk:按列统计才是它的主场

awk 按列处理文本,$1、2、2、NF 分别表示第 1 列、第 2 列和最后一列,配合内置变量能直接做统计。

# 统计每个 IP 的访问次数,取前 10 名
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
# 计算接口平均耗时(假设第 10 列是耗时,单位毫秒)
awk '{sum+=$10; n++} END {print "平均耗时:", sum/n, "ms"}' access.log
# 只输出状态码是 200 且耗时超过 1000 毫秒的请求
awk '$9==200 && $10>1000 {print $1, $7, $10}' access.log

四、三剑客组合实战

三者串联时遵循“grep 过滤、awk 统计、sed 整理”的顺序,例如先找出慢请求,再按接口分组统计,最后把结果写进报告文件。

grep " 200 " access.log | awk '{print $7}' | sort | uniq -c | sort -nr > report.txt
sed -n '1,5p' report.txt

五、新手容易踩的坑

第一,sed 加 -i 之前一定要备份;第二,awk 的列号要先用 head 确认分隔符,默认按空格和制表符分列;第三,grep 匹配特殊字符时记得加 -F 按固定字符串处理,或者用反斜杠转义;第四,管道越长越要分段验证,先看中间结果再继续拼接。

小结

grep 找行、sed 改行、awk 算列,记住这个分工就不会用错工具。平时遇到日志排查,先想想能不能用一行命令解决,再决定要不要写脚本。把上面几个例子在自己的测试日志上跑一遍,三剑客就算入门了。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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