Witam ponownie, moze nie jest to napisane elegancko, ale jak juz pisalem na Perl'u sie nie znam, doszedlem do czegos takiego:
Kod: Zaznacz cały
use File::ReadBackwards ;
sub process_line{
my($line) = @_;
#(1) tu trzeba pobrac domene z linii i ja zliczyc
return $line;
}
$bw = File::ReadBackwards->new('/var/log/access.log') or die "Nie moge czytac pliku\n" ;
($second, $minute, $hour, $dayOfMonth, $month, $yearOffset, $dayOfWeek, $dayOfYear, $daylightSavings) = localtime();
$half=$minute%10;
while (defined( $log_line = $bw->readline)){
if($half < 5){
if($log_line =~ m/.*:[0-9][0-4]\s.*/){
print process_line($log_line);
}
}
else{
if($log_line =~ m/.*:[0-9][5-9]\s.*/){
print process_line($log_line);
}
}
}
#(2)tu trzeba wyswietlic wynik
$bw->close();
Najpierw pobieram liczbe minut z czasu systemego (da sie jakos prosciej ?) nastepnie czytam plik od konca i sprawdzam czy linie pasuja do warunku 5 minut (jak lepiej napisac to wyrazenie regularne ? )
Problem mam teraz w wyciagnieciu nazw domen z linii, w jaki sposob to zrobic najsensowniej ? (procedura "process_line) komentarz (1)...
Rowniez nie mam pomyslu jak zalatwic sprawe liczenia domen, rozumiem idee tablicy asjocacyjnej podanej wyzej, lecz nie wiem jak to zaimplementowac w Perl'u, komentarz (2)
Prosze o szczere opinie i sugestie optymalizacji kodu, chetnie sie czegos naucze.
Pozdrawiam