Reguläre Ausdrücke
Marcel
- perl
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
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
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
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.