当前位置: 首页 > news >正文

Linux 日志分析实战:grep 组合 awk/sed 实现 5 类复杂多关键字过滤

Linux 日志分析实战:grep 组合 awk/sed 实现 5 类复杂多关键字过滤

日志分析是每个运维工程师和开发者的必修课。当服务器出现异常时,我们需要快速从海量日志中定位问题;当业务出现波动时,我们需要从访问日志中分析用户行为。而 grep、awk 和 sed 这三大文本处理神器,正是解决这些问题的瑞士军刀。

本文将带你深入实战,通过 5 个典型场景,展示如何组合这些命令实现复杂过滤。不同于基础教程只讲解单一命令,我们聚焦于工具间的协作,解决真实工作中的日志分析难题。

1. 基础准备:理解 grep 的三种匹配模式

在开始组合命令前,我们需要夯实基础。grep 支持三种正则表达式语法,这直接影响我们如何编写匹配模式:

# 基本正则表达式(BRE) - 需要转义特殊字符 grep 'error\|warning' /var/log/syslog # 扩展正则表达式(ERE) - 不需要转义 grep -E 'error|warning' /var/log/syslog # Perl兼容正则(PCRE) - 功能最强大 grep -P '\d{4}-\d{2}-\d{2}' /var/log/nginx/access.log

关键区别

  • BRE 中|+?等元字符需要转义
  • ERE 中这些元字符可以直接使用
  • PCRE 支持更复杂的特性如向前向后断言

提示:在性能敏感的场景,BRE 通常比 ERE 和 PCRE 更快,因为它的匹配算法更简单。

2. 多条件过滤:实现与、或、非逻辑

实际工作中,我们很少只需要匹配单个关键词。更常见的是需要组合多个条件的复杂查询。

2.1 或逻辑(OR) - 匹配任意条件

查找包含 error、warning 或 critical 的日志行:

# 基本正则写法(需要转义|) grep 'error\|warning\|critical' /var/log/syslog # 扩展正则写法(更清晰) grep -E 'error|warning|critical' /var/log/syslog # 等价于 egrep 'error|warning|critical' /var/log/syslog

2.2 与逻辑(AND) - 必须同时满足

查找同时包含 "failed" 和 "connection" 的行:

grep 'failed' /var/log/nginx/error.log | grep 'connection'

这种管道方式会先筛选包含 "failed" 的行,再从结果中筛选包含 "connection" 的行。

2.3 非逻辑(NOT) - 排除特定内容

查找包含 "error" 但不包含 "timeout" 的行:

grep 'error' /var/log/syslog | grep -v 'timeout'

-v参数表示反向匹配,即排除匹配的行。

3. 上下文提取:显示匹配行前后的内容

单纯看到匹配行往往不够,我们需要上下文来理解日志的完整场景。

# 显示匹配行及其后5行 grep -A 5 'panic' /var/log/kern.log # 显示匹配行及其前3行 grep -B 3 'segmentation fault' /var/log/syslog # 显示匹配行及其前后各2行 grep -C 2 'Out of memory' /var/log/messages

参数说明

  • -A NUM:显示匹配行后的 NUM 行(After)
  • -B NUM:显示匹配行前的 NUM 行(Before)
  • -C NUM:显示匹配行前后各 NUM 行(Context)

4. 高级过滤:结合 awk 进行字段级处理

当需要基于特定字段进行过滤时,awk 比 grep 更加强大。考虑这个 Nginx 访问日志片段:

192.168.1.1 - - [10/Oct/2023:14:32:01 +0800] "GET /api/user HTTP/1.1" 200 1234 192.168.1.2 - - [10/Oct/2023:14:32:02 +0800] "POST /api/login HTTP/1.1" 401 567

4.1 查找状态码为 500 的请求

awk '$9 == 500 {print}' /var/log/nginx/access.log

4.2 查找 POST 请求且响应时间大于 1 秒的请求

假设日志中包含响应时间(如 $request_time):

awk '$6 == "\"POST" && $(NF-1) > 1 {print}' /var/log/nginx/access.log

4.3 结合 grep 和 awk 进行复杂过滤

查找包含 "api" 的 URL 且状态码为 4xx 或 5xx 的请求:

grep '/api/' /var/log/nginx/access.log | awk '$9 ~ /^[45][0-9]{2}$/'

5. 实战案例:Nginx 访问日志分析脚本

下面是一个完整的 Nginx 日志分析脚本,综合运用了 grep、awk、sort 和 uniq:

#!/bin/bash LOG_FILE="/var/log/nginx/access.log" # 1. 统计最频繁的10个IP echo "Top 10 IPs:" awk '{print $1}' $LOG_FILE | sort | uniq -c | sort -nr | head -10 # 2. 统计最频繁的10个URL echo -e "\nTop 10 URLs:" awk -F'"' '{print $2}' $LOG_FILE | awk '{print $2}' | sort | uniq -c | sort -nr | head -10 # 3. 统计不同状态码的数量 echo -e "\nStatus code statistics:" awk '{print $9}' $LOG_FILE | sort | uniq -c | sort -nr # 4. 统计5xx错误的请求 echo -e "\n5xx Errors:" grep -E ' 5[0-9]{2} ' $LOG_FILE | awk -F'"' '{print $2" - "$1}' # 5. 查找可疑扫描行为(频繁404) echo -e "\nPossible scanners (frequent 404s):" awk '$9 == 404 {print $1" - "$7}' $LOG_FILE | sort | uniq -c | sort -nr | head -5

脚本功能

  1. 统计访问最频繁的客户端IP
  2. 找出最常访问的URL
  3. 分析不同HTTP状态码的分布
  4. 提取所有5xx服务器错误
  5. 检测可能的恶意扫描行为(频繁404)

6. 性能优化:处理大型日志文件的技巧

当日志文件很大时(GB级别),命令的效率变得至关重要。以下是一些实用技巧:

  1. 使用 LC_ALL=C:临时设置区域设置为C,可显著加快grep速度

    LC_ALL=C grep 'error' huge.log
  2. 减少管道数量:每个管道都会创建新进程,影响性能

    # 较差 - 多个管道 cat huge.log | grep 'error' | grep -v 'debug' # 更好 - 单个grep完成 grep 'error' huge.log | grep -v 'debug' # 最佳 - 使用awk一次性处理 awk '/error/ && !/debug/' huge.log
  3. 使用更快的替代工具

    • ag(The Silver Searcher):比grep更快
    • ripgrep(rg):现代高效的文本搜索工具
  4. 并行处理:使用GNU parallel处理超大文件

    cat huge.log | parallel --pipe grep 'error'

注意:在处理生产环境日志时,始终先在日志备份或测试环境验证命令,避免意外修改或删除重要数据。

http://www.jsqmd.com/news/1134593/

相关文章:

  • CentOS 7.6 Swap 分区动态调整:从 1.2G 扩容至 2.2G 的 8 步操作实录
  • YOLO目标检测演进史:从v1到v13,如何解决速度、精度与部署难题
  • 属性 sdn的策略自动生成方案
  • LTC6903数字控制振荡器与STM32集成指南
  • Deepin Boot Maker:5分钟制作Linux启动盘的开源神器
  • Spring Boot集成Google Authenticator实现TOTP两步验证实战
  • r77-rootkit Shellcode无文件部署:反射式DLL注入与内存驻留技术详解
  • JDK系列15:JDK21虚拟线程正式版深度实战|彻底解决Java高并发IO瓶颈
  • statsmodels 0.14.0 seasonal_decompose 实战:加法与乘法分解的3步核心差异
  • Linux chmod 755 与 644 权限实战:Web服务器部署的3个关键场景配置
  • Wand-Enhancer完整指南:快速免费解锁WeMod专业版功能的终极解决方案
  • 为什么文件明明是 UTF-8,PowerShell 里还是中文乱码?一篇讲透 Codex、Claude 等 AI 编码工具下的排查与修复
  • Windows 10/11 硬盘分区变 RAW:3 步数据抢救与 chkdsk /f 修复实战
  • AndroidKiller 1.3.1 + IDA Pro 6.8 逆向实战:3种方法破解 Native 层 CrackMe
  • 前缀和题解:多加一个哨兵,少掉一堆边界判断
  • 受到启发,写了一个验证输入的简易框架
  • 银河麒麟V10 SP1 密码策略配置:PAM cracklib 模块 12 个参数详解与实战
  • 统信UOS V20 自启动管理优化:5步禁用非必要服务,开机速度提升30%
  • 2026玉林黄金回收白银回收铂金回收旧料回收怎么选?五家高实价铂金白银线下门店测评清单 + 联系方式
  • WinBtrfs终极指南:如何在Windows上无缝读写Linux Btrfs文件系统
  • DeepL Chrome扩展:5分钟实现专业级浏览器划词翻译的完整指南
  • OpenSSH 9.8p1 与 OpenSSL 3.0 版本兼容性实战:CentOS 7 升级避坑 5 步指南
  • Crontab 5分钟级任务监控:3个关键日志与2种状态检查命令
  • Web安全测试实战指南:从核心漏洞原理到主流工具选型
  • CentOS 7.6 Swap 分区动态调整:从 1.2G 扩容至 2.2G 的 8 步实操
  • 从DVWA到实战:手把手教你用sqlmap进行SQL注入漏洞检测
  • Win10 家庭版相机权限修复:3种方案实测对比,神州网信工具+驱动重装最有效
  • DVWA 1.10 文件上传漏洞实战:3种绕过手法与蚁剑/菜刀连接成功率对比
  • JVM监控及诊断工具命令行篇之jmap实战:从内存快照到线上问题定位
  • CPU核心手动调度优化:提升性能与能效的实战指南