Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl在日志文件中计算昨天的点击次数_Perl_Count_Logfiles - Fatal编程技术网

perl在日志文件中计算昨天的点击次数

perl在日志文件中计算昨天的点击次数,perl,count,logfiles,Perl,Count,Logfiles,我正在做一个作业,我需要解析一个日志文件,并根据所述日志文件创建一个网站。其中一个要求是,我要计算昨天发生的点击次数,当涉及到这件事时,我迷失了方向。我附上了我的代码和我正在处理的日志文件,希望有人能提供一些建议,谢谢 #!/usr/bin/perl use strict; use warnings; use Time::Piece; use Time::Seconds qw(ONE_DAY); my $yesterday = localtime() - ONE_DAY(); print $

我正在做一个作业,我需要解析一个日志文件,并根据所述日志文件创建一个网站。其中一个要求是,我要计算昨天发生的点击次数,当涉及到这件事时,我迷失了方向。我附上了我的代码和我正在处理的日志文件,希望有人能提供一些建议,谢谢

#!/usr/bin/perl
use strict;
use warnings;
use Time::Piece;
use Time::Seconds qw(ONE_DAY);


my $yesterday = localtime() - ONE_DAY();
print $yesterday;




open(LOGFILE,"<", "access.log")or die"Could not open log file.";
my $yesterdayHits=0;

my $totalhits=0;
my $webPage='log.html';

open(WEBPAGE,">",$webPage);
print WEBPAGE ("<HEAD><TITLE>Access Counts</TITLE></HEAD>");
print WEBPAGE ("<BODY>");
print WEBPAGE ("<H1> today is: ",scalar(localtime), "</H1>");
print WEBPAGE ("<h3>Yesterday was $yesterday</h3>");
print WEBPAGE ("<TABLE BORDER=1 CELLPADDING=10 width='500px'>");

foreach my $line (<LOGFILE>) {
    $totalhits++;
    my $w = "(.+?)";
    $line =~ m/^$w $w $w \[$w:$w $w\] "$w $w $w" $w $w/;

    my $site     = $1;
    my $logName  = $2;
    my $fullName = $3;
    my $date     = $4;
    my $time     = $5;
    my $gmt      = $6;
    my $req      = $7;
    my $file     = $8;
    my $proto    = $9;
    my $status   = $10;
    my $length   = $11;
    #if($line =~ m/$yesterday/){$yesterdayHits++}


print WEBPAGE ("<Tr><TD>$site</TD><TD>$line</TD></Tr>\n\n");


}



close(LOGFILE);
print WEBPAGE ("<h2>Total hits: $totalhits</h2>");
print WEBPAGE ("<h3>Hits Yesterday: $yesterdayHits</h3>");
print WEBPAGE ("</TABLE></P>");
print WEBPAGE ("</BODY></HTML>");
close(WEBPAGE); 

一种基本方法是修改
$dayed
变量(与logfile相同),如下所示:

$yesterday =~ s!\w+\s+(\w+)\s+(\d+)\s+\d{2}:\d{2}:\d{2}\s+(\d+)!$2/$1/$3!;
现在您可以取消注释并更改行

if ($date eq $yesterday) { $yesterdayHits++ }

开始计数。

不是很快,但相当精确;使用UNIX时间戳:

#!/usr/bin/env perl
use strict;
use warnings 'all';

use HTTP::Date;
while (<>) {
    my $stamp;
    print if
        m{\s+\[(.+?)\]\s+\"}x
        and $stamp = str2time($1)
        and $stamp > time - 86_400 * 2
        and $stamp < time - 86_400;
}
#/usr/bin/env perl
严格使用;
使用“全部”警告;
使用HTTP::Date;
而(){
我的美元邮票;
打印如果
m{\s+\[(.+?)\]\s+\“}x
和$stamp=str2time($1)
和$stamp>time-86_400*2
$stamp
$Dayed现在包含日志文件格式的昨天日期(例如“11/Nov/2012”)。您可以通过选中
$line=~/$Dayed/;


可能有问题,因为示例访问日志上的时区从-0400到+0300不等。
#!/usr/bin/env perl
use strict;
use warnings 'all';

use HTTP::Date;
while (<>) {
    my $stamp;
    print if
        m{\s+\[(.+?)\]\s+\"}x
        and $stamp = str2time($1)
        and $stamp > time - 86_400 * 2
        and $stamp < time - 86_400;
}
use POSIX;

$yesterday = strftime("%d/%b/%Y",localtime(time()-86400));