2014-08-28 4 views
0

В приведенном ниже коде я пытаюсь искать каждый раз, когда обращается к одному из URL-адресов в моем массиве. Этот скрипт работает ... однако есть лишние накладные расходы, так как я загружаю «external.access_logs» для каждой итерации в цикле for.цикл через массив без загрузки данных каждый раз

также хотелось бы вытащить IP-адрес из строки журнала по каждому URL-адресу, ниже приведен пример строки журнала, любые рекомендации будут оценены.

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 и избегать вызова оболочки, если это абсолютно необходимо. – ThisSuitIsBlackNot

ответ

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

спасибо за входной мельник, когда я пытаюсь запустить код, я получаю сообщение об ошибке в команде split, я думаю .. «Использование неинициализированного значения $ file в элементе хэша в строке 14» – user3821215

+0

Тогда одна из ваших строк данных не содержат 4-й элемент. Один простой способ исправить это - добавить ярлык для перехода к следующей строке, если это значение не определено. Я отредактировал сценарий, чтобы сделать это. – Miller

Смежные вопросы