在处理网站访问日志时,经常需要区分本地访问和远程访问。本文将介绍一个简单的Perl脚本,它可以帮助统计来自本地(例如"localhost",即"127.0.0.1")和其他地方的访问次数。
在许多情况下,需要统计特定IP地址的访问次数。例如,可能想知道有多少访问来自本地服务器("127.0.0.1"),以及有多少来自外部。下面是一个实现这一功能的Perl脚本示例。
Apache生成的日志文件包含许多行,每行的开头都类似于这样:
127.0.0.1 - - [10/Apr/2007:10:39:11 +0300] ...
127.0.0.1 - - [10/Apr/2007:10:39:11 +0300] ...
139.12.0.2 - - [10/Apr/2007:10:40:54 +0300] ...
217.1.20.22 - - [10/Apr/2007:10:40:54 +0300] ...
首先是IP地址,然后是一个空格,一个短横线(-),后面跟着更多的数据。
以下是一个Perl脚本,用于统计本地和远程访问次数:
#!/usr/bin/perl
use strict;
use warnings;
my $file = shift or die "Usage: $0 FILE\n";
open my $fh, '<', $file or die "Could not open '$file': $!";
my $local = 0;
my $remote = 0;
while (my $line = <$fh>) {
my $length = index($line, " ");
my $ip = substr($line, 0, $length);
if ($ip eq "127.0.0.1") {
$local++;
} else {
$remote++;
}
}
print "Local: $local Remote: $remote\n";
将此脚本保存为"analyzer.pl",然后使用"perl analyzer.pl"命令运行它。
脚本的第一行被称为shebang,如果希望将脚本转换为Unix/Linux可执行文件,它是必须的。
use strict;
use warnings;
这两行类似于其他语言中的编译器标志,它们帮助避免常见的编程错误。称它们为安全网,写任何Perl脚本都不会没有它们。
my $file = shift or die "Usage: $0 FILE\n";
上面的代码可以分为两部分来解释:
my $file = shift
这行代码从@ARGV数组中取出第一个元素,即命令行参数,然后将其移动到刚刚声明的$file变量中。
接下来是"or"逻辑运算符。如果用户提供了文件名,"or"的左侧将被评估为真,脚本继续执行。如果用户没有提供命令行参数,"or"的右侧将启动,Perl将停止执行并显示使用消息。
然后声明两个标量变量,并将0赋值给它们。将使用它们作为以"127.0.0.1"开头的行数和其他行数的计数器。
while (my $line = <$fh>) {
}
while循环逐行读取文件,并为每一行执行块中的内容。当完成文件读取时,while循环将停止。
my $length = index($line, " ");
index()函数获取一个字符串和一个子字符串,并返回子字符串(第二个参数)在第一个字符串中的位置。它使用0为基的索引,正在寻找一个空格。结果数字将是当前行中IP地址的长度。
my $ip = substr($line, 0, $length);
substr()函数获取一个字符串,一个索引(偏移量)和一个长度。它返回位于特定位置的子字符串。在例子中,它恰好是当前行的IP地址。
剩下的就是检查这是否是"localhost",并相应地增加计数器。
if ($ip eq "127.0.0.1") {
$local++;
} else {
$remote++;
}
print "Local: $local Remote: $remote\n";