Ich versuche, eine Protokolldatei zu öffnen, sie anhand einer Liste von Schlüsselwörtern zu durchsuchen, jede Zeile mit diesem Schlüsselwort zu drucken und die Ergebnisdatei anschließend in ein .gz zu komprimieren.Durchsuchen einer komprimierten Protokolldatei nach einer Liste mit Schlüsselwörtern
Ich habe den folgenden Code erstellt, der ohne Kompilierungsfehler startet. Es schreibt in die Ergebnisdatei, aber wenn ich das Skript ausführe, wird es nie abgeschlossen und findet keine Ergebnisse. Irgendeine Hilfe?
#!/usr/bin/perl
use IO::Uncompress::Gunzip qw($GunzipError);
use IO::Compress::Gzip qw(gzip $GzipError) ;
use diagnostics;
use strict;
use warnings;
my %LOGLINES =();
my %count =();
open(FILE, "</data/bro/scripts/Keywords.txt");
my %keywords = map { chomp $_; $_, 1 } <FILE>;
close(FILE);
my $logfile = IO::Uncompress::Gunzip->new("/data/bro/logs/2016-05-05/http.00:00:00-06:00:00.log.gz")
or die "IO::Uncompress::Gunzip failed: $GunzipError\n";
open(FILE, "+>Results.txt");
my @results = <FILE>;
foreach my $line ($logfile) {
while (<>) {
my @F=split("\t");
next unless ($F[2] =~ /^(199|168|151|162|166|150)/);
$count{ $F[2] }++;
if ($count{ $F[2] } == 10) {
print @{ $LOGLINES{$F[2]} }; # print all the log lines we've seen so far
print $_; # print the current line
} elsif ($count{ $F[2] } > 10) {
print $_; # print the current line
} else {
push @{ $LOGLINES{$F[2]} }, $_; # store the log line for later use
}
my $flag_found = grep {exists $keywords{$_} } split /\s+/, $line;
print $line if $flag_found;
}
}
IO::Compress::Gzip("results.gz")
or die "IO::Compress::Gunzip failed: $GzipError\n";
close(FILE);
Im Allgemeinen beinhaltet die 'while (<>)' Zeile eine Tastatureingabe. Vielleicht ist das der Grund, warum Ihr Skript "nie beendet" wird. – red0ct
@ red0ct ist korrekt. Was ist die Absicht der 'while' Schleife? Es möchte, dass du Zeug eingibst. Sie schleifen bereits die Zeilen von '$ logfile' mit der' foreach' (wenn auch nur einmal, weil Sie nichts auf dem :: Gunzip-Objekt aufrufen). – simbabque
Die while-Schleife sollte jede Zeile der Protokolldatei bis zum Ende durchsuchen. Habe ich das falsch gemacht? –