1、背景介绍
2024年双十一那天凌晨三点,我被电话吵醒。线上服务出现大面积超时,用户投诉量激增。登录服务器一看,最近4小时产生了将近12GB的Nginx访问日志。领导在群里催着要故障原因,我需要在最短时间内从这堆日志里找出问题根源。
如果用传统的方式打开日志文件,光是vim加载就得等好几分钟。用Python写脚本?来不及了。这时候,grep、sed、awk这三板斧就成了救命稻草。
我用一行命令组合,30秒内就定位到了问题:某个爬虫IP在疯狂请求一个数据库密集型的接口,直接把数据库连接池打满了。封禁IP后,服务立刻恢复。
这就是Shell三剑客的魅力。干了10年SRE,我越来越觉得,这三个工具是运维工程师的核心竞争力。不管你用多么高级的日志分析平台,遇到紧急情况时,能在命令行里快速处理数据的能力永远不会过时。
2、技术特点
为什么grep、sed、awk能做到如此高效?这得从它们的设计哲学说起。
1)流式处理:三剑客都采用流式处理机制,一次只读取一行到内存,处理完就释放。这意味着处理10GB文件和处理10MB文件的内存消耗是一样的。相比之下,如果你用Python的readlines()把整个文件读进内存,10GB文件直接就把机器干趴下了。
2)C语言实现:这三个工具都是用C语言写的,经过了几十年的优化,底层直接调用系统I/O,效率极高。我做过测试,处理相同的日志文件,awk比Python快5-10倍是很正常的。
3)管道机制:Unix的管道设计是天才之作。多个命令通过管道串联,数据像水一样流过去,不需要中间临时文件。这不仅节省了磁盘I/O,还让命令可以并行执行。
4)正则表达式引擎:grep和sed的正则表达式引擎经过高度优化,特别是grep -F(固定字符串搜索)和GNU grep的DFA引擎,在特定场景下性能惊人。
3、三剑客分工
在实际工作中,我是这样区分三者使用场景的:
1)grep:专注搜索过滤。需要从海量日志中快速找出包含特定关键词的行时用它。它干的活很专一,但干得特别好。
2)sed :擅长文本替换。批量修改配置文件、格式转换、删除特定行等场景用它。我把它理解成"流编辑器",数据流过它的时候被修改。
3)awk:复杂数据处理。需要对字段进行计算、统计、聚合时用它。它其实是一门完整的编程语言,只是我们通常只用到它的一小部分功能。
4、适用场景
根据我的经验,以下场景特别适合用三剑客:
1)故障排查:快速定位错误日志、统计错误频率、找出异常请求
2)日志分析:统计访问量、分析响应时间分布、识别恶意IP
3)配置管理:批量修改配置文件、格式转换、数据清洗
4)数据处理:CSV/JSON处理、报表生成、数据校验
5)自动化脚本:作为Shell脚本的核心组件处理文本数据
不适合的场景也要说清楚:
1)复杂的多文件关联分析:这种场景还是用ELK或者写Python脚本更合适
2)需要持久化存储的场景:三剑客是一次性处理,不会保存状态
3)需要复杂数据结构的场景:awk虽然有数组,但处理复杂嵌套结构还是力不从心
5、环境要求
本文的所有命令都在以下环境测试通过:
如果你用的是macOS,系统自带的是BSD版本的工具,语法和GNU版本略有差异。我强烈建议用Homebrew安装GNU版本:
brew install grep sed gawk ripgrep
安装后,GNU版本的命令前缀是g,比如ggrep、gsed、gawk。你也可以在.bashrc里设置别名:
版本检查命令:
二、详细步骤
1、准备工作
1)生成测试数据
在正式开始之前,我们需要一些测试数据。下面这个脚本能生成类似真实环境的Nginx访问日志:
这个脚本生成的日志格式是标准的Nginx combined格式,最后多加了一个响应时间字段。1000万行大约1GB,生成时间取决于你的机器性能。
如果你想快速生成更大的文件用于性能测试,可以用下面这个更高效的方法:
2)了解日志格式
在开始处理之前,我习惯先看几行日志,了解数据格式:
输出类似:
192.168.1.100 - - [06/Jan/2025:10:23:45 +0800] "GET /api/users HTTP/1.1" 200 1234 "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" 0.045
分析一下字段结构:
这个分析过程很重要,因为后面用awk处理时,字段编号直接决定了取数的正确性。
2、核心配置
1)grep核心参数
grep的参数不少,但常用的就那么几个。我按使用频率排序:
-E和-P的区别:这是个常见困惑点。-E是POSIX扩展正则,支持+、?、|、()这些元字符不用转义。-P是Perl兼容正则(PCRE),支持更多高级特性,比如\d(数字)、\s(空白)、(?=)(前瞻)等。
我的选择标准:简单匹配用-E,需要用到\d、\w这类简写或者零宽断言时用-P。但要注意,macOS的grep不支持-P参数,需要安装GNU grep。
2)sed核心参数
sed的参数相对少,但理解工作模式很重要:
重要提醒:sed -i会直接修改文件,没有撤销操作。生产环境一定要先备份或者用sed -i.bak创建备份文件。我见过太多人用sed -i把配置文件改坏了,又没有备份,只能从别的机器拷贝。
3)awk核心参数
awk是三剑客中最复杂的,因为它是一门完整的编程语言。核心概念:
3、启动验证
在正式开始处理日志之前,我习惯先做几个验证:
这些检查能帮你避免很多坑,比如:
三、示例代码和配置
1、完整配置示例
场景一:统计Nginx日志中的TOP10 IP
这是最常见的需求,几乎每次排查问题都会用到:
性能对比:处理1GB日志(约1000万行)
方法2更快的原因是:awk在内存中用关联数组直接计数,避免了中间管道传输和sort的排序开销。
场景二:统计TOP10 URL及其响应时间
场景三:找出5xx错误的请求详情
场景四:从应用日志提取并聚合错误堆栈
这个需求稍微复杂一些,因为错误堆栈通常跨多行:
2、实际应用案例
案例一:批量修改配置文件
场景:需要把所有服务器上的Nginx配置中的worker_processes auto改成worker_processes 8:
更复杂的例子:修改Redis配置中的多个参数
案例二:日志分析生成CSV报表
这个需求在月度汇报、容量规划时很常见:
生成可视化友好的报表:
案例三:实时监控日志
三剑客配合tail可以实现简单的实时监控:
案例四:多文件关联分析
场景:从多个日志文件中关联分析同一个请求ID:
四、最佳实践和注意事项
1、性能优化
经过这些年的实践,我总结了一些提升处理速度的技巧:
1)能用grep过滤的先过滤
这是最重要的原则。如果你只需要处理包含"ERROR"的行,先用grep过滤可以大幅减少后续处理的数据量:
grep的过滤速度比awk快很多,特别是使用-F(固定字符串)时。
2)使用并行处理
对于大文件,可以用GNU parallel或者xargs实现并行:
3)使用ripgrep替代grep
ripgrep(rg)是用Rust写的grep替代品,在大多数场景下都比GNU grep快:
4)避免不必要的排序
sort是性能杀手,尤其是处理大文件时会产生临时文件:
5)使用LC_ALL=C加速
设置LC_ALL=C可以禁用UTF-8处理,大幅提升速度:
6)利用mmap和buffer
处理大文件时,调整buffer大小可以提升性能:
2、安全加固
1)永远不要直接在生产环境执行sed -i

2)处理用户输入时防止命令注入

3)限制资源使用

3、常见错误
错误1:字段分隔符理解错误
错误2:正则表达式贪婪匹配
错误3:多行处理的坑
错误4:忘记处理特殊字符
错误5:awk数值精度问题
五、故障排查和监控
1、日志查看
1)快速定位问题的技巧
2)结构化日志处理
现代应用越来越多使用JSON格式日志:
2、问题排查
1)常见问题诊断流程
问题1:命令执行很慢
问题2:awk结果不正确
问题3:sed替换没生效
问题4:内存不足
3、监控告警
1)简易的日志监控脚本
2)配合cron的定时分析
六、总结
1、要点回顾
经过这些年处理各种日志问题的经验,我总结出以下关键点:
1)选择合适的工具
2)性能优化原则
3)安全第一
4)调试技巧
2、技能提升路径
如果你想在三剑客上更进一步,我建议按这个顺序学习:
1)初级阶段
2)中级阶段
3)高级阶段
3、进阶方向
三剑客之外,还有一些现代工具值得关注:
这些工具不是要替代三剑客,而是在特定场景下的补充。核心还是要把grep、sed、awk用熟,它们是所有Linux系统的标配,不需要额外安装。
>>>>
参考资料
附录
附录A:命令速查表
grep速查
sed速查
awk速查
附录B:正则表达式速查
基础元字符
PCRE扩展(grep -P)
附录C:常用组合命令
附录D:性能基准测试结
测试环境:
附录E:术语表
本文作者有10年SRE经验,专注于大规模分布式系统运维。文中所有命令均在生产环境验证过,但请根据实际情况调整使用。
来源丨公众号:运维派(ID:yunweipai)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
活动推荐
5月22日,2026 XCOPS 智能运维管理人年会「广州站」重磅来袭!聚焦大模型迭代、AI Agent 深度应用等技术热点,邀请一众行业领军人物、技术大咖,从技术架构、实战案例到科研成果,与大家一起探索AI应用于智能运维与数据库的最佳方式,共同破解垂类智能体落地、多Agent协同、数据库自治技术工程化、核心系统信创与智能化平衡等现实难题。
扫描下方二维码即可报名:
如果字段的最大可能长度超过255字节,那么长度值可能…
只能说作者太用心了,优秀
感谢详解
一般干个7-8年(即30岁左右),能做到年入40w-50w;有…
230721