2014-08-28 66 views
0

在下面的代码中,我试图在每次访问数组中的一个URL时搜索。这个脚本可以工作......但是由于我在我的for循环中为每个迭代加载了 “external.access_logs”,所以存在不必要的开销。循环访问数组,每次都不加载数据集

另外我想从每个URL匹配的日志行中提取IP地址,下面是一个示例日志行,任何指导将不胜感激。

2014-08-28  16:19:36  GET /login/do.jsp 200  -  "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36"  -  727e13230b5dadbab1c0b6eda77dcf613ba5120e80dbaff753ff8e14e3d36aae501e3a004aeba73e238a50e36bc3c5922491f01cd433de30663ddeb2fb09d023c742a9e5e16f5b4eb08b213d" -  -  -  "45.25.25.64" 

脚本:

#!/usr/bin/perl 
use warnings; 
use strict; 

my $date1 = `date -d "-1 day" +"%y-%m-%d"`; 
chomp $date1; 

my @array = ("/login/do.jsp", "/logout/do.jsp", "/query/do.jsp"); 

print "# of times resource was used, resource URL\n"; 

for (@array) { 
    chomp $_; 
    my $cmd = `cat /weblogs/daily_summaries/$date1/external.access_logs |awk {'print \$4'} |grep -i "$_" |wc -l`; 
    chomp $cmd; 
    print "$cmd,$_\n"; 
} 
print "Complete!\n"; 
+3

有没有需要调用'date','cat',或'awk'在Perl脚本中。你可以在纯Perl中完成所有这些事情,并且应该避免调用一个shell,除非绝对必要。 – ThisSuitIsBlackNot 2014-08-28 21:01:00

回答

0

分析日志文件一旦建立自己的罪状:

#!/usr/bin/perl 
use strict; 
use warnings; 
use autodie; 

my $date1 = `date -d "-1 day" +"%y-%m-%d"`; 
chomp $date1; 

my %count; 

open my $fh, '<', "/weblogs/daily_summaries/$date1/external.access_logs"; 
while (<>) { 
    my $file = (split)[3] // next; 
    $count{$file}++; 
} 

my @array = ("/login/do.jsp", "/logout/do.jsp", "/query/do.jsp"); 

print "# of times resource was used, resource URL\n"; 

for (@array) { 
    print "$count{$_},$_\n"; 
} 
print "Complete!\n"; 
+0

感谢输入miller,当我尝试运行代码时,我在分割命令上出现错误,我想......“在第14行的哈希元素中使用未初始化值$文件” – user3821215 2014-08-29 02:11:37

+0

然后,其中一条数据行没有包含第四个元素。解决这个问题的一个简单方法是添加一个快捷方式,以便在未定义该值的情况下跳至下一行。我编辑了脚本来做到这一点。 – Miller 2014-08-29 02:39:42