在Web服务器运维中,Nginx的访问日志记录了用户的访问信息,是分析用户行为、监控网站状态的重要数据来源。然而,手动分析这些日志数据既繁琐又耗时。今天,我将为大家介绍一个强大的Bash脚本,它能够自动分析Nginx访问日志,并提取出有价值的信息,帮助你更好地了解用户行为和网站状态。
脚本内容:
#!/bin/bash
# 日志格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"
LOG_FILE=$1
echo "统计访问最多的10个IP"
# 使用awk统计每个IP的访问次数,并按次数降序排列,取前10个
awk '{a[$1]++}END{print "UV:",length(a);for(v in a)print v,a[v]}' $LOG_FILE | sort -k2 -nr | head -10
echo "----------------------"
echo "统计时间段访问最多的IP"
# 使用awk筛选指定时间段的日志,并统计每个IP的访问次数,按次数降序排列,取前10个
# 注意:时间范围设置存在问题,起始时间应小于结束时间,且格式需与日志中的时间格式一致
awk -v start="01/Dec/2018:13:20:25" -v end="27/Nov/2018:16:20:49" '$0 ~ start, $0 ~ end {a[$1]++} END {for(v in a) print v, a[v]}' $LOG_FILE | sort -k2 -nr | head -10
echo "----------------------"
echo "统计访问最多的10个页面"
# 使用awk统计每个页面的访问次数,并只显示访问次数大于10次的页面,按次数降序排列
awk '{a[$7]++}END{print "PV:",length(a);for(v in a){if(a[v]>10)print v,a[v]}}' $LOG_FILE | sort -k2 -nr | head -10
echo "----------------------"
echo "统计访问页面状态码数量"
# 使用awk统计每个页面及其对应状态码的访问次数,并只显示访问次数大于5次的组合
awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}' $LOG_FILE | sort -k2 -nr
使用方法:
- 将上述脚本保存为一个文件,例如nginx_log_analysis.sh。
- 赋予脚本执行权限:chmod +x nginx_log_analysis.sh。
- 运行脚本并传入Nginx访问日志文件作为参数:./nginx_log_analysis.sh /path/to/access.log。
注意事项:
- 请确保传入的日志文件路径正确,并且日志格式与脚本中定义的格式一致。
- 在统计时间段的访问最多的IP时,我修正了时间范围的设置,并添加了-v选项来定义起始时间和结束时间变量。但是,请注意时间范围的设置仍然存在问题:起始时间应该在结束时间之前。你需要根据实际情况调整时间范围。
- 脚本中的时间格式应与Nginx日志中的时间格式一致。如果时间格式不匹配,你需要修改awk命令中的时间格式部分。
- 脚本的输出结果将按照访问次数降序排列,并显示访问次数最多的前10个结果(或满足条件的结果)。你可以根据需要调整这些参数。
本文暂时没有评论,来添加一个吧(●'◡'●)