ログファイルを開き、キーワードのリストに対して検索し、そのキーワードを含むすべての行を出力し、結果ファイルを.gzに圧縮しようとしています。圧縮されたログファイルをキーワードリストと照合して検索する
コンパイルエラーなしで実行を開始する以下のコードを用意しました。結果ファイルに書き込みますが、スクリプトを実行すると完了することはなく、決して結果が見つかりません。どんな助け?この行は、キーボードからの入力を伴うため
#!/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);
一般に、while(<>)行にはキーボード入力が含まれます。おそらく、これがあなたのスクリプトが「完了しない」理由です。 – red0ct
@ red0ctは正しいです。 'while'ループの意図は何ですか?あなたはものを入力してほしい。あなたはすでに '$ logfile'の行を' foreach'でループしています(これは:: Gunzipオブジェクトで何も呼び出さないためです)。 – simbabque
whileループは、最後に達するまでログファイルの各行を検索し続けることでした。私はそれについて間違ったやり方をしましたか? –