用ref="/tag/2/" style="color:#479099;font-weight:bold;">Perl正则处理Nginx日志中的IP统计
在做网站运维时,经常需要从Nginx的访问日志里快速找出高频访问的IP,判断是否有爬虫攻击或异常流量。这时候手写脚本比翻日志文件高效得多。一个典型的Nginx日志行长这样:
192.168.1.100 - - [15/Mar/2023:14:22:10 +0800] "GET /article/123 HTTP/1.1" 200 1024 "-" "Mozilla/5.0 (Windows NT 10.0)"目标是提取每一行的IP地址,并统计出现次数。Perl的正则表达式非常适合这种结构化文本提取。
编写简单的IP提取脚本
下面这个Perl脚本读取日志文件,用正则匹配IP,并计数:
#!/usr/bin/perl
use strict;
use warnings;
my %ip_count;
open(my $fh, '<', '/var/log/nginx/access.log') or die "无法打开日志文件: $!";
while (my $line = <$fh>) {
if ($line =~ /^([\d.]+) - -/) {
my $ip = $1;
$ip_count{$ip}++;
}
}
close($fh);
for my $ip (sort { $ip_count{$b} <=> $ip_count{$a} } keys %ip_count) {
print "$ip: $ip_count{$ip} 次\n";
}这里的关键正则是 ^([\d.]+) - -,它从行首开始匹配由数字和点组成的IP字符串。虽然不能完全校验IP合法性,但在日志格式固定的前提下足够可靠。
过滤特定请求路径
有时候只想看访问API接口的记录,比如所有请求以 /api/v1/ 开头的行。可以加一条更复杂的正则:
if ($line =~ /^([\d.]+) - - .*\"GET \/api\/v1\//) {
$ip_count{$1}++;
}这条规则会跳过静态资源、页面访问,只关注API调用,帮助定位异常调用源。
识别恶意User-Agent
有些扫描工具会使用特征明显的User-Agent,比如包含 sqlmap 或 python-requests。可以用正则批量筛查:
if ($line =~ /\"([^\"]+)\"$/ && $1 =~ /(sqlmap|nikto|curl.*bot)/i) {
print "可疑User-Agent发现:$line";
}通过组合字段提取和条件判断,能快速构建出轻量级防护监控逻辑。
实际应用场景
上周有个客户反馈网站变慢,我们跑了一遍日志分析脚本,发现某个IP在十分钟内发起超过两千次请求,且集中在登录接口。正是靠这段Perl脚本第一时间锁定目标,配合防火墙封禁,避免了进一步影响。
这类小工具不需要复杂框架,几行正则就能解决问题。在网络优化过程中,掌握Perl正则的实际用法,比依赖第三方软件更灵活,也更适合定制化需求。