Strona 2 z 2

Re: PERL - czytanie logow seserwa co godzine

: 2007-08-04, 00:39
autor: mina86
malyrd pisze:po kolei pobieram linie z /etc/hosts z ip i nazwa hosta a pozniej poszukuje w /etc/hosts.arp linii z ip i mac adresem jak cos takiego rozwiazac bez pakowania ktoregos z plikow w tablice ?
Trzymać pliki posortowane.

Re: PERL - czytanie logow seserwa co godzine

: 2007-08-04, 13:09
autor: Sektor
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

Re: PERL - czytanie logow seserwa co godzine

: 2007-08-04, 13:49
autor: Zielony
(1)

Kod: Zaznacz cały

sub process_line {
    my ($line) = (shift =~ /\b([\w\.]+?\.(?:com|net|org|info|pl|itd))\b/);
}
W zmiennej $line będzie nazwa domeny. Nie rozumiem, po co chcesz ją wyświetlać. Jeżeli w procedurze ta zmienna nie będzie potrzebna, to lepiej tak:

Kod: Zaznacz cały

sub process_line {
   shift =~ /\b([\w\.]+?\.(?:com|net|org|info|pl|itd))\b/;
}
(2)
Tablicę asocjacyjną musimy zadeklarować gdzieś na początku programu, aby była w zasięgu.

Kod: Zaznacz cały

my %domeny;
Zliczanie rozwiązujemy tak, jak już napisałem.

Kod: Zaznacz cały

$domeny{$line}++;
Wyświetlanie:

Kod: Zaznacz cały

for (keys %domeny) {
   print "$_ - $domeny{$_}\n";
}