Marcel: Reguläre Ausdrücke

Hallo zusammen!
Ich habe schonmal ein Forumeintrag über Reguläre Ausdrücke hier erstellt, aber ich find ihn nicht mehr, da keine Suchanfragen mehr bearbeitet werden können....

naja,
es geht um ein log file eines squid servers...
ich will aus url's einen bestimmten teil filtern

so hatte ich es gemacht:

if($log =~ /^(https?|ftps?)://(.*?)/(*.?)$/)
{
print "$2";

ich lasse dann diese domainen zählen mit

my %domain_hits;
$domain_hits{$2}++;

so habe ich alle hits pro Domainen bekommen. aber mir ist aufgefallen, das nur get und post anfragen mit http etc anfagen. connect anfragen sind aber in diesem format:   xxxxx.xxxxx.de:4563

diese werden also weggelassen... also muss da noch eine regel irgenwie rein.

ich dachte, dass es so gehen müsste:

if($log =~ /^(https?|ftps?)://(.*?)/(*.?)$|(*.?).(*.?)$/)
{
print "$2";

aber dies geht nicht, weil ich ja dann die get und post anfragen mit $2 bekomme und die connect anfragen mit $1$2, oder verstehe ich da was falsch?!

vielen dank schon mal im voraus

gruß
marcel

  1. Hallo Marcel

    if($log =~ /^(https?|ftps?)://(.*?)/(*.?)$|(*.?).(*.?)$/)
    {
    print "$2";

    aber dies geht nicht, weil ich ja dann die get und post anfragen mit $2 bekomme und die connect anfragen mit $1$2, oder verstehe ich da was falsch?!

    Da verstehst Du glaub ich was falsch.

    Ich habs nicht asuprobiert, aber ich denke, dass bei Deinem sog. connect das if nicht matcht! Denn Du findest nur Muster die entweder https oder ftps  beginnen. Du musst dir also in der RegEx etwas anderes einfallen lassen... (Einfach (https?|ftps?):// weglassen, dann wirds gefunden, dann halt - wenn vorhanden - https:// oder ftps:// vorne abschneiden.?)

    HTH
    kaepten

    1. die logdatei ist vorher in das array @datei geladen worden.
      sie besteht aus 9 spalten, dies wird mit dem split geteilt und im endeffekt in einem hash (%logentry).

      und mit dem IF habe ich alle einträge bekommen die mit http und ftp angefangen haben, d.h. der originale eintrag sieht z.B.so aus:

      http://officescan-t.activeupdate.trendmicro.com/Activeupdate/server.ini

      ich will aber nur "officescan-t.acriveupdate.trendmicro.com" haben

      oder
      http://www.crazyhandyfun.de/layouts/layout-1/images/bt_kurzel.gif

      "www.crazyhandyfun.de"

      allerdings sind wohl auch solche einträge vorhanden:

      freemail.web.de:443

      da soll natürlich nur "freemail.web.de" bei rauskommen.

      so sieht mein script aus:

      my %ip_hits;
      my %ip_bytes;
      my %domain_hits;
      my %domain_bytes;

      foreach(@datei)
      {
      @elemente = split(/ +/, $_);
      local %logentry = (time => $elemente[0],elapsed => $elemente[1], remotehost => $elemente[2], code_status => $elemente[3], bytes => $elemente[4], method => $elemente[5], url => $elemente[6], rfc931 => $elemente[7], peerstatus_peerhost => $elemente[8], type => $elemente[9]);

      $log= $logentry{url};
      if ($log =~ /^(https?|ftps?)://(.*?)/(.*?)$/)
       {
       $ip_hits{$logentry{remotehost}}++;
       $ip_bytes{$logentry{remotehost}}+=$logentry{bytes};
       $domain_hits{$2}++;
       $domain_bytes{$2}+=$logentry{bytes};
       }

      }#ENDE foreach

      gruß
      marcel

      1. die logdatei ist vorher in das array @datei geladen worden.

        Das machst du?
        Du musst riesige Mengen Speicher haben, so ne Datei sind doch gern mal zig MB.

        http://officescan-t.activeupdate.trendmicro.com/Activeupdate/server.ini

        ich will aber nur "officescan-t.acriveupdate.trendmicro.com" haben

        oder
        http://www.crazyhandyfun.de/layouts/layout-1/images/bt_kurzel.gif

        "www.crazyhandyfun.de"

        allerdings sind wohl auch solche einträge vorhanden:

        freemail.web.de:443

        da soll natürlich nur "freemail.web.de" bei rauskommen.

        Du suchst evtl. sowas:

        my $log = 'http://officescan-t.activeupdate.trendmicro.com:8080/Activeupdate/server.ini';

        $log =~ /.*//([^/^:]*)/;

        print "$log\n$1";

        Struppi.