PERL - czytanie logow seserwa co godzine

Problemy dotyczące programowania.

Moderatorzy: Moderatorzy, Administratorzy

Awatar użytkownika
mina86
Moderator
Posty: 3335
Rejestracja: 2004-06-14, 21:58
Lokalizacja: Linux 5.x x86_64
Kontakt:

Re: PERL - czytanie logow seserwa co godzine

Post 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.
Zastrzegam sobie prawo nieanalizowania postów pisanych niepoprawną polszczyzną.
Post generated automatically by A.I. system code name ‘mina86’ in response to the previous one.
Awatar użytkownika
Sektor
Użytkownik
Posty: 271
Rejestracja: 2004-08-28, 12:21
Lokalizacja: Kraków
Kontakt:

Re: PERL - czytanie logow seserwa co godzine

Post 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
Awatar użytkownika
Zielony
Użytkownik
Posty: 535
Rejestracja: 2005-03-17, 18:22
Lokalizacja: Poznań
Kontakt:

Re: PERL - czytanie logow seserwa co godzine

Post 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";
}
Ostatnio zmieniony 2007-08-04, 14:03 przez Zielony, łącznie zmieniany 3 razy.
Żyję - nie każdemu się zdarza - a we krwi mam chlorofil.
[url=http://scxd.info/][img]http://scxd.info/pub/scxdbar/scxd-bar.png[/img][/url]
[b]Registered User #448882[/b]
[img]http://scxd.info/say/img.php[/img]
ODPOWIEDZ