每天面对成百上千行的日志文件,是不是光看着就头大?想从里面找出报错信息,翻得眼睛都花了;想统计访问次数,手动计数还总出错。其实用 Perl 写几个小脚本,这些活儿分分钟就能搞定。今天这个 perl 教程,就专门说处理日志文件的实用脚本编写方法,全是大白话,新手也能跟着做。
先搞懂日志文件的 “脾气”,脚本才好写
日志文件看着乱,其实有规律可循。一般来说,每行都有固定格式,比如时间、IP 地址、操作内容这些。咱们写脚本前,得先看看日志长啥样。
比如有个访问日志,一行长这样:“2024-05-20 10:30:00 192.168.1.1 访问了首页”。这里面,时间、IP、操作都清清楚楚。脚本就是要从这些固定位置里,把咱们需要的信息 “抠” 出来。
不过话说回来,有些日志格式特别乱,一行里啥都有,这时候就得先花点时间分析,不然脚本写出来也不管用。兔子哥建议,拿到日志先复制几行到记事本,用笔圈出要提取的内容,这样思路会清楚很多。
写个脚本找报错,再也不用逐行翻
最常用的就是从日志里找带 “error”“失败” 这类关键词的行。比如想找出所有含 “error” 的记录,脚本可以这么写:
open(LOG, "access.log");
open(ERROR, ">error.log");
while (
if ($_ =~ /error/i) { # 加i表示不区分大小写
print ERROR $_;
}
}
close(LOG);
close(ERROR);
运行后,所有报错行都会存到 error.log 里,是不是比手动翻快多了?这里有个小细节,用 “=~” 是 Perl 里的匹配符号,记不住可以理解成 “包含” 的意思。
但有些朋友可能会问,要是想找 “error” 后面带数字的行,该怎么办呢?可以把匹配条件改成 /error\d+/,其中 \d + 代表一串数字,这样就能精准定位特定错误了。
统计 IP 出现次数,脚本比 Excel 还快
很多时候需要统计某个 IP 出现了多少次,用 Perl 脚本几分钟就能出结果,比 Excel 函数简单多了。
脚本大概是这样的:
open (LOG, "access.log");
my % ip_count; # 用哈希存 IP 和次数
while (
if ($_ =~ /(\d+.\d+.\d+.\d+)/) { # 提取IP地址
$ip = $1; # $1 就是提取到的 IP
ip_count{ip}++; # 次数加 1
}
}
close (LOG);
打印结果
foreach my ip(keysprint"ip 出现了 ip_count{ip} 次 \n";
}
这个脚本里,% ip_count 就像个计数器,每遇到一个 IP 就记一次。不过要注意,不同日志的 IP 位置可能不一样,得根据实际情况调整提取 IP 的正则表达式,要是正则写错了,可能统计出来全是 0,这时候就得检查表达式是不是匹配对了。
按时间筛选日志,指定时间段轻松提取
有时候只需要某天的日志,比如 2024-05-20 的,用脚本可以直接把这天的记录挑出来。
脚本示例:
open (LOG, "access.log");
open (DAYLOG, ">20240520.log");
while (
if ($_ =~ /2024-05-20/) { # 匹配日期
print DAYLOG $_;
}
}
close(LOG);
close(DAYLOG);
要是想更精确,比如只提取 10 点到 12 点的,可以把条件改成 / 2024-05-20 1 [0-1]:/,这样就能过滤出指定时间段的日志了。不过对于一些格式特殊的时间,比如用 “/” 分隔的日期,可能需要调整匹配方式,具体怎么改,我也得查资料再试试,毕竟日志格式太多样了。
其实处理日志的脚本,核心就是 “提取 - 处理 - 输出” 这三步。刚开始写可能会出错,但多改几次就熟了。兔子哥觉得,与其花几小时手动处理,不如花半小时学写脚本,一次学会,以后都省事。这些脚本都可以直接改改文件名和条件就能用,希望能帮到常和日志打交道的朋友。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~