Thread gnu-grep braucht ewig unter Perl (system) (7 answers)
Opened by equinox at 2010-11-01 12:37

topeg
 2010-11-01 13:16
#142394 #142394
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
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 CPAN: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)

View full thread gnu-grep braucht ewig unter Perl (system)