Thread gnu-grep braucht ewig unter Perl (system)
(7 answers)
Opened by equinox at 2010-11-01 12:37
Dafür brauchst du gar keine externen Programme:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #!/usr/bin/perl use strict; use warnings; my @lines_found; for my $file (glob('/kunden/homepages/20/d264326328/htdocs/logs/access.log*')) { next unless(-f $file); if(open(my $fh, '<', $file)) { while(my $line=<$fh>) { push(@lines_found,$line) if($line=~m!"(?:POST |GET .*=(?:htt|ft|ph)p(?::|%3a)(?:/|%2f)).* HTTP/[0-9]\.[0-9]" [23][0-9]{2}!i) } close($fh); } else { warn "ERROR open $file ($!)\n"; } } print $_ for(@lines_found); Wenn du doch mal tiefer verschachtelte suchen machen willst. Es gibt das Modul File::Find Was die lange Ausführung betrifft wie hast du den Aufruf gemacht? Unter Umständen hat Perl den String interpretiert, bevor er ausgeführt wurde und verändert. Das würde dann bewirken dass etwas ganz anderes gemacht wurde als du erwartest. EDIT: Ich habe übersehen, dass du auch komprimierte Dateien lesen willst. Darum hier das angepasste Beispiel: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #!/usr/bin/perl use strict; use warnings; use IO::Uncompress::Gunzip; use File::Type; my $ft = File::Type->new(); my @lines_found; for my $file (glob('/home/httpd/thttpd.log*')) { next unless(-f $file); my $fh=undef; if($ft->mime_type($file)=~/gzip/) { unless($fh=IO::Uncompress::Gunzip->new($file)) { warn "ERROR open compressed $file ($IO::Uncompress::Gunzip::GunzipError)"; } } else { unless(open($fh, '<', $file)) { warn "ERROR open $file ($!)\n"; } } if($fh) { while(my $line=<$fh>) { push(@lines_found,$line) if($line=~m!"(?:POST |GET .*=(?:htt|ft|ph)p(?::|%3a)(?:/|%2f)).* HTTP/[0-9]\.[0-9]" [23][0-9]{2}!i) } close($fh); } } print $_ for(@lines_found); Last edited: 2010-11-01 17:34:40 +0100 (CET) |