数码常识网
霓虹主题四 · 更硬核的阅读氛围

Perl正则项目实例:网络日志分析实战

发布时间:2025-12-16 23:20:29 阅读:328 次

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,比如包含 sqlmappython-requests。可以用正则批量筛查:

if ($line =~ /\"([^\"]+)\"$/ && $1 =~ /(sqlmap|nikto|curl.*bot)/i) {
print "可疑User-Agent发现:$line";
}

通过组合字段提取和条件判断,能快速构建出轻量级防护监控逻辑。

实际应用场景

上周有个客户反馈网站变慢,我们跑了一遍日志分析脚本,发现某个IP在十分钟内发起超过两千次请求,且集中在登录接口。正是靠这段Perl脚本第一时间锁定目标,配合防火墙封禁,避免了进一步影响。

这类小工具不需要复杂框架,几行正则就能解决问题。在网络优化过程中,掌握Perl正则的实际用法,比依赖第三方软件更灵活,也更适合定制化需求。