grep/awk/sed 三剑客极简入门!

7 阅读4分钟

在后端 / 运维日常工作中,排查bug、筛选异常、统计接口调用量都离不开日志处理,而 grep/awk/sed 这三把Linux工具,就是解决这类问题的效率神器。

这篇文章只讲「日常日志」过滤的核心用法,不搞复杂语法,新手复制粘贴改参数就能搞定大多的场景,主打极简落地。

先明确核心分工

  1. grep:主打「查找 / 过滤」,快速揪出包含指定关键字的日志行
  2. awk:主打「按列提取 / 统计」,处理结构化日志(分隔符拆分)、做简单计数求和
  3. sed:主打「文本替换 / 快速编辑」,批量修改日志内容格式

环境与示例日志

基于Linux终端,示例日志app.log格式如下(时间 | IP | 接口 | 状态 | 响应时间):

2026-02-03 10:00:00 | 192.168.1.1 | /api/user/login | 200 | 15
2026-02-03 10:00:05 | 192.168.1.2 | /api/user/info | 500 | 200
2026-02-03 10:00:10 | 192.168.1.1 | /api/order/create | 200 | 30
2026-02-03 10:00:15 | 192.168.1.3 | /api/user/login | 401 | 10
2026-02-03 10:00:20 | 192.168.1.2 | /api/user/login | 200 | 18
2026-02-03 10:00:25 | 192.168.1.4 | /api/order/pay | 500 | 250
2026-02-03 10:00:30 | 192.168.1.1 | /api/user/info | 200 | 22

一、grep:快速找内容(最常用)

核心:按关键字匹配,输出整行符合条件的内容。

核心语法

grep [参数] "关键字" 日志文件

必学实用参数 + 实战(直接复制)

  1. 基础查找:找所有500异常日志

    grep "500" app.log
    
  2. 显示行号:找登录接口日志,带行号方便定位

    grep -n "/api/user/login" app.log
    
  3. 多关键字:同时找500和401异常

    grep -E "500|401" app.log
    
  4. 显示上下文:找500异常,同时显示前后各2行(排查报错必备)

    grep -C 2 "500" app.log
    
  5. 反向过滤:过滤掉200正常日志,只留异常

    grep -v "200" app.log
    

小结

记住:找内容用grep,行号 -n、多关键字 -E、上下文 -C、反向过滤 -v。

二、awk:按列提取+统计(处理数据)

核心:按分隔符拆分列,提取数据或做简单统计。

核心语法

awk -F "分隔符" '条件 {处理动作}' 日志文件

必学基础 + 实战(直接复制)

  1. 按列提取:指定|为分隔符,提取所有接口路径(第3列)

    awk -F "|" '{print $3}' app.log
    
  2. 条件提取:提取500异常的 IP 和接口(第2、3列)

    awk -F "|" '$4 == " 500" {print $2, $3}' app.log
    
  3. 分组统计:统计每个接口的调用次数(日常高频)

    awk -F "|" '{arr[$3]++} END{for (i in arr) print i, arr[i]}' app.log
    
  4. 数值计算:计算登录接口的平均响应时间

    awk -F "|" '$3 == " /api/user/login" {sum+=$5; count++} END{print "平均响应时间:", sum/count}' app.log
    

小结

记住:-F指定分隔符、$n引用第 n 列、数组统计次数、END输出最终结果。

三、sed:批量替换+编辑(修改文本)

核心:批量替换、删除文本内容,处理日志格式很方便。

核心语法

sed [参数] 's/旧内容/新内容/替换标记' 日志文件

必学实用参数+实战

  1. 基础替换:将日志中的500替换为SERVER_ERROR(仅输出,不修改原文件)

    sed 's/500/SERVER_ERROR/' app.log
    
  2. 全局替换:每行所有匹配的内容都替换(默认只替换每行第一个)

    sed 's/|/ /g' app.log  # 把所有|替换为空格,规整格式
    
  3. 修改原文件:直接修改日志文件(加-i,谨慎使用,建议先备份)

    sed -i 's//api//v1/api/g' app.log  # 给所有接口加v1前缀(Linux)
    # macOS 需加后缀(空后缀直接修改):sed -i '' 's//api//v1/api/g' app.log
    
  4. 删除行:删除包含200的正常日志行(输出结果,不修改原文件)

    sed '/200/d' app.log
    

小结

记住:替换用s/旧/新/g、全局替换加g、修改原文件加-i、删除行用/关键字/d

四、日常高频组合用法

三剑客可以通过管道符|组合使用,解决更复杂的需求,举个栗子🌰:

  1. 先过滤500异常,再提取IP并去重

    grep "500" app.log | awk -F "|" '{print $2}' | sort | uniq
    
  2. 先提取接口,再替换格式,最后统计次数

    awk -F "|" '{print $3}' app.log | sed 's/ //g' | sort | uniq -c
    

总结

  1. 快速查找关键字:用 grep,核心参数-n/-E/-C/-v
  2. 按列提取 / 统计数据:用 awk,核心-F分隔符、$n列引用。
  3. 批量替换 / 编辑文本:用 sed,核心s/旧/新/g-i修改原文件。
  4. 复杂需求用管道符|组合三剑客,复制文中示例改参数即可落地。

其实说实话,自从我学会了awk后,就很少用sed了。因为awk是轻量文本处理语言,包含grep的过滤和 sed的编辑等核心能力。打个比方:另外俩哥们像是自行车,近距离好使,但是远距离做不到,而awk像是汽车,哪都能去。但是如果只是走50米取个快递,算上上车、系安全带、点火……显然自行车速度更快啊🤪