AWK 日志分析

《AWK 日志分析》


🎯 学习目标

  • 掌握使用 AWK 对系统日志、Nginx/Apache 访问日志、安全日志等常见日志格式的解析与统计
  • 能够编写脚本提取关键字段(如 IP、时间、状态码、请求路径)
  • 实现高频访问统计、错误识别、用户行为分析等实用功能
  • 理解不同 Linux 发行版日志格式差异(Ubuntu vs CentOS vs EulerOS)
  • 提升日志处理效率,为自动化运维和安全审计打下坚实基础

🔑 核心重点

类别 内容
日志类型 系统日志 /var/log/syslog、认证日志 /var/log/auth.log、Web 日志 /var/log/nginx/access.log
常用字段提取 IP 地址、时间戳、HTTP 方法、URL、状态码、User-Agent
分析技巧 高频访问统计、错误码识别、IP 汇总、时间段分布
性能优化 使用 next 跳过无关行;减少正则匹配次数;合理使用数组
注意事项 不同发行版日志路径差异;权限问题影响读取;awk/gawk 兼容性

📚 详细讲解


一、Linux 常见日志类型概览

日志类型 文件路径 特点说明
系统日志 Ubuntu: /var/log/syslog
CentOS/EulerOS: /var/log/messages
包含内核、服务、守护进程等信息
认证日志 Ubuntu: /var/log/auth.log
CentOS/EulerOS: /var/log/secure
登录尝试、sudo 操作、SSH 登录记录
Web 访问日志 Nginx: /var/log/nginx/access.log
Apache: /var/log/apache2/access.log
用户访问路径、IP、状态码等
内核日志 /var/log/kern.logdmesg 输出 硬件相关、驱动加载、OOM 杀死进程等

📌 小贴士:

  • 查看日志前建议使用 head -n 5 /path/to/log 确认字段位置
  • 大部分日志需要管理员权限才能查看,建议加 sudo

二、实战案例:Nginx/Apache Web 日志分析

🧪 场景:提取访问最多的 IP 和路径

示例日志内容:
192.168.1.100 - - [22/Jun/2025:12:34:56 +0800] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0"
✅ 提取访问最多 IP 的脚本:
awk '{ip[$1]++} END {for (k in ip) print ip[k], k}' access.log | sort -nr | head -n 10

📌 输出示例:

150 192.168.1.100
120 192.168.1.101
✅ 提取访问最多路径的脚本:
awk '{path[$7]++} END {for (k in path) print path[k], k}' access.log | sort -nr | head -n 10

📌 输出示例:

80 /index.html
50 /about.html

三、实战案例:按小时统计访问量(带函数封装)

🧪 场景:分析每个小时的访问频率

awk '
function get_hour(log_time,    t) {
    gsub(/\[|\+.*$/, "", log_time);
    split(log_time, t, ":");
    return t[2];
}

{
    hour = get_hour($4)
    count[hour]++
}

END {
    for (h in count)
        print h ":00 ~ " h ":59", count[h], "次访问"
}' access.log

📌 输出示例:

12:00 ~ 12:59 150 次访问
13:00 ~ 13:59 200 次访问

✅ 应用价值:

  • 安全监控:发现异常高峰访问
  • 容量规划:了解流量高峰时段
  • 自动化报表:生成每日访问趋势图

四、实战案例:识别高频错误码(4xx、5xx)

🧪 场景:统计 4xx(客户端错误)和 5xx(服务器错误)的请求来源

awk '
$9 >= 400 && $9 < 600 {
    error_ip[$1]++
}
END {
    print "错误来源IP统计:"
    for (ip in error_ip)
        print ip, error_ip[ip]
}' access.log

📌 输出示例:

错误来源IP统计:
192.168.1.100 12
192.168.1.102 5

✅ 应用价值:

  • 安全审计:识别恶意扫描
  • 性能优化:定位频繁出错的接口或页面

五、实战案例:SSH 登录失败尝试分析(Ubuntu vs CentOS vs EulerOS)

🧪 场景:从认证日志中提取 SSH 登录失败的 IP

Ubuntu 日志路径:/var/log/auth.log
awk '/Failed password for/ {ip[$(NF-3)]++} END {for (k in ip) print k, ip[k]}' /var/log/auth.log

📌 输出示例:

192.168.1.100 5
192.168.1.102 3
CentOS/EulerOS 日志路径:/var/log/secure
awk '/Failed password for/ {ip[$(NF-3)]++} END {for (k in ip) print k, ip[k]}' /var/log/secure

📌 输出示例:

192.168.1.100 5
192.168.1.102 3

⚠️ 注意事项:

  • 字段位置可能因日志格式略有不同,请先观察几行日志确认 $NF-3 是否正确
  • 建议配合 grep 过滤日期范围,例如:
grep "Jun 22" /var/log/auth.log | awk '...'

六、实战案例:合并多个日志并分类输出

🧪 场景:将 syslog 和 auth.log 合并成一份日志,并标注来源

awk '
{
    if (FILENAME == "/var/log/syslog")
        source = "syslog"
    else if (FILENAME == "/var/log/auth.log")
        source = "auth"

    print "[" source "]", $0
}' /var/log/syslog /var/log/auth.log > merged.log

📌 输出到 merged.log 示例:

[syslog] Jun 22 10:00:00 ...
[auth] Jun 22 10:00:00 sshd[...]

✅ 应用价值:

  • 集中式日志管理
  • 安全审计时区分日志类型
  • 自动化报告生成工具基础

七、不同 Linux 发行版注意事项(Ubuntu vs CentOS vs EulerOS)

功能 Ubuntu CentOS EulerOS
默认 awk gawk gawk gawk
支持 PROCINFO["sorted_in"] ✅(gawk 4.0+)
日志文件位置 /var/log/syslog, /var/log/auth.log /var/log/messages, /var/log/secure 同 CentOS
权限要求 查看 /var/log/* 需要 sudo 同左 同左

📌 小贴士:

  • 在 CentOS/EulerOS 上查看 /var/log/secure 需要管理员权限,建议使用 sudo awk ...
  • 不同系统的日志格式会影响字段提取逻辑,请先观察几行日志结构再写脚本

八、调试与优化建议

技巧 说明
print $0 打印原始行内容,确认是否符合预期
print NF 查看字段数量是否正确
print substr($0, 1, 50) 查看前几个字符,辅助定位字段偏移
`head -n 5 file awk '...'`
BEGIN{FS=","} 设置合适的字段分隔符提升可读性
next 提前跳过无用行,提升执行效率
delete array 清空数组释放内存,适用于大文件处理

✅ 总结

掌握 AWK 的日志分析能力,是构建自动化运维和安全审计体系的关键技能。通过以下方式,你可以在 Ubuntu、CentOS、EulerOS 等不同 Linux 系统上高效地完成日志处理任务:

  • 提取关键字段(IP、时间、状态码、路径)
  • 统计高频访问、错误请求、登录尝试等行为
  • 结合 grepsortuniq 构建完整日志分析流水线
  • 使用 next、预定义变量、数组查找等技巧提升脚本性能

继续练习真实日志文件,你会越来越熟练地运用这些日志分析技巧,成为一名真正的 Linux 文本处理高手!🚀🔥

posted @ 2025-06-22 23:17  红尘过客2022  阅读(54)  评论(0)    收藏  举报