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/syslogCentOS/EulerOS: /var/log/messages |
包含内核、服务、守护进程等信息 |
| 认证日志 | Ubuntu: /var/log/auth.logCentOS/EulerOS: /var/log/secure |
登录尝试、sudo 操作、SSH 登录记录 |
| Web 访问日志 | Nginx: /var/log/nginx/access.logApache: /var/log/apache2/access.log |
用户访问路径、IP、状态码等 |
| 内核日志 | /var/log/kern.log 或 dmesg 输出 |
硬件相关、驱动加载、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、时间、状态码、路径)
- 统计高频访问、错误请求、登录尝试等行为
- 结合
grep、sort、uniq构建完整日志分析流水线 - 使用
next、预定义变量、数组查找等技巧提升脚本性能
继续练习真实日志文件,你会越来越熟练地运用这些日志分析技巧,成为一名真正的 Linux 文本处理高手!🚀🔥

浙公网安备 33010602011771号