Reguläre Ausdrücke zur Textinhalts Zählung

Reficul

Lieutenant
Registriert
Aug. 2006
Beiträge
525
Gute Tag Community,

ich hab eine Logdatei in der hunderte Zeilen sind, in den Zeilen ist eine IP-Adresse, ein Datum, ein Code und "kleiner Informationen" enthalten. Es die gleiche IP mit dem gleichen Code mehrmals nur mit verschiedenen "kleinen Informationen", ich würde gerne wissen wie oft ein bestimmter Code von einer IP-Adresse ab

z.B.:

192.2.45.32 [19/May/2014:09:11:40 +0200] GET R1e4247f9af04303d286cb6acfbb39782 Win7 .NET ...
192.2.45.32 [19/May/2014:09:11:45 +0200] POST R1e4247f9af04303d286cb6acfbb39782 Win7 .NET
192.2.45.32 [19/May/2014:09:11:50 +0200] GET R1e4247f9af04303d286cb6acfbb39782 Win7 .NET

Nun würde ich gerne das er mir diesen Block nur einmal zählt. Dieser Blcok hat drei Zeilen, andere haben fünf oder acht, also kann ich nicht pauschal sagen, Zähl die erste Reihe und ignoriere den rest.
Am Ende soll gezählt werden welcher Code wie oft gezählt wurde.

Mein erster Gedanke kam in dem Moment auf Reguläre Ausdrücke, da mir das noch ausm Studium bekannt war, allerdings hatten wir nie solch komplexe Sachen damit gemacht. Geht das überhaupt mit Regulären Ausdrücken, das man ihm sagt wenn das so ist dann inkrementiere eine Variable, oder gibt es sowas nicht bei Reguläremn Ausdrücken.

oder vllt hat jemand eine andere Methode oder ein Textprogramm was dies kann?

ich wäre euch sehr dankbar für die Hilfe.
Gruß Adrian
 
Reficul schrieb:
Nun würde ich gerne das er mir diesen Block nur einmal zählt. Dieser Blcok hat drei Zeilen, andere haben fünf oder acht, also kann ich nicht pauschal sagen, Zähl die erste Reihe und ignoriere den rest.

Kombination von Hash und regulärem Ausdruck, kein Problem.

Was genau ist denn ein Block? Wann geht der nächste los? was ist das Kriterium?
 
Ich habe nicht ganz verstanden was du willst.

Du willst die Anzahl der verschiedenen IP/Code Kombinationen?
 
genau, es ist eine Logfile eines Servers darüber wie oft was runtergeladen wurde. Leider haben wir nur Zugang zur Logfile, dieses ist ungefähr so aufgebaut:

192.2.45.32 [19/May/2014:09:11:50 +0200] GET R1e4247f9af04303d286cb6acfbb39782 Win7 .NET
192.2.45.32 [19/May/2014:09:11:50 +0200] POST R1e4247f9af04303d286cb6acfbb39782 Win7 .NET
192.2.45.32 [19/May/2014:09:11:50 +0200] GET R1e4247f9af04303d286cb6acfbb39782 Win7 .NET
192.223.5.12 [20/May/2014:10:11:50 +0200] GET R1e4247f9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.223.5.12 [20/May/2014:10:11:50 +0200] POST R1e4247f9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.223.5.12 [20/May/2014:10:11:50 +0200] GET R1e4247f9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.223.5.12 [20/May/2014:10:11:50 +0200] GET R1e4247f9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.223.5.12 [20/May/2014:10:11:50 +0200] POST R1e4247f9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.223.5.12 [20/May/2014:10:11:50 +0200] GET R1e4247f9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.3.5.19 [21/May/2014:10:11:50 +0200] GET R1e42adsad9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.3.5.19 [21/May/2014:10:11:50 +0200] POS TR1e42adsad9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.3.5.19 [21/May/2014:10:11:50 +0200] GET R1e42adsad9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.3.5.19 [21/May/2014:10:11:50 +0200] POST R1e42adsad9af04303dsdfsdfs6acfbb39782 Win7 .NET
192.3.5.19 [21/May/2014:10:11:50 +0200] GET R1e42adsad9af04303dsdfsdfs6acfbb39782 Win7 .NET

So in etwa. ich habe eine Liste mit Codes (eben das was hinter GET/POST steht) und möchte am Ende wissen welcher Code (der Code definiert eine Datei aufm server) wie oft runtergeladen wurde. Nun war mein Gedanke das dies am besten geht wenn ich IP und Code abgleiche, nur muss ich dann natürlich noch die Wiederholung ignorieren und dann das Ergebniss irgendwo/wie zwischenspeichern.
 
Also mit RegEx alleine dürfte das nichts werden.

Kannst du programmieren? Wenn ja dann ist das sehr einfach.
Aber da du hier fragst, nehme ich an du kannst das nicht.

Wenn du es nicht eilig hast, kann ich dir dafür mal etwas programmieren.
 
Reficul schrieb:
möchte am Ende wissen welcher Code (der Code definiert eine Datei aufm server) wie oft runtergeladen wurde. Nun war mein Gedanke das dies am besten geht wenn ich IP und Code abgleiche, nur muss ich dann natürlich noch die Wiederholung ignorieren und dann das Ergebniss irgendwo/wie zwischenspeichern.
Kleines Perl-Skript:
Code:
my $fn = 'logfile.dat';
my %counter;
open my $fh, '<', $fn or die "$!";

while (<$fh>) {
   if(/^(\S+)\s+\[[^]]+\]\s+\w+\s+(\w+)/) {
       ++$counter{"$2\t$1"}
   }
}
close $fh;

while( my($k, $v) = each %counter) {
   print "$k = $v\n"
}
liefert:
R1e4247f9af04303d286cb6acfbb39782 192.2.45.32 = 3
TR1e42adsad9af04303dsdfsdfs6acfbb39782 192.3.5.19 = 1
R1e4247f9af04303dsdfsdfs6acfbb39782 192.223.5.12 = 6
R1e42adsad9af04303dsdfsdfs6acfbb39782 192.3.5.19 = 4
 
Zuletzt bearbeitet:
Ich habe Kenntnisse in Java, Objective C und C. Aber nur das wissen was ich im Studium erarbeitet habe, keine tiefgreifenden Kenntnisse.
Mit Perl habe ich zB in meinem Leben noch nie gearbeitet.

@blöderidiot
das ist schon echt gut. aber da wird jeder Aufruf gezählt, ich bräuchte ne Ausgabe die in die Richtung geht:

R1e4247f9af04303d286cb6acfbb39782 = 3
TR1e42adsad9af04303dsdfsdfs6acfbb39782 = 1
R1e4247f9af04303dsdfsdfs6acfbb39782 = 6
R1e42adsad9af04303dsdfsdfs6acfbb39782 = 4

und ich meine nicht das einfach die IP weggelassen wird sondern das er einen Code mit einer IP zählt und nicht öfter. also in dem Fall oben müsste das Ergebnis so aussehen:

R1e4247f9af04303d286cb6acfbb39782 = 1
TR1e42adsad9af04303dsdfsdfs6acfbb39782 = 1
R1e4247f9af04303dsdfsdfs6acfbb39782 = 1
R1e42adsad9af04303dsdfsdfs6acfbb39782 = 1


Gruß Adrian
 
So richtig?
Unbenannt.png

Wenn du willst, kann ich dafür noch ein GUI basteln.
 
sieht super aus.

GUI sieht natürlich schick aus, aber musst dir jetzt auch kein riesen aufwand machen. ich danke jetzt schonmal, diese Community begeistert mich seit Jahren mit Leuten wie euch. :)
 
Nenne mal ein paar wünsche was du in der gui haben willst. Soll es einfach als Liste dargestellt werden? Oder etwa als Diagramm? Außerdem wäre es dafür hilfreich, wenn du mir mal so ein log zuschickst.

Da ich in den Ferien eh nicht viel zu tun habe, ist das Recht für mich.
 
Ich kann dir das Log per Mail schicken.

Als Liste ist ok, einfach nur das man sieht welcher Code wie oft aufgerufen wurde, von welchen IPs muss nicht mit ausgegeben werden.

Wann würdest du es denn ungefähr fertig haben, weil ne einfache Textausgabe reicht im Notfall auch, falls es zu lange dauern würde.

Gruß Adrian
 
reficul, zum wieder warm werden, schau dir mal diese tabelle an. mit regulären ausdrücken kann man nur entscheiden, ob es einen match gibt, aber man kann damit nicht aufzählen, weil der entsprechende automat keinen stack hat. so wie du es in deiner fragestellung bereits richtig gedeutet hast :)
 
Reficul schrieb:
Als Liste ist ok, einfach nur das man sieht welcher Code wie oft aufgerufen wurde, von welchen IPs muss nicht mit ausgegeben werden.

Läuft das unter Linux oder unter Windows?
 
Da ich gerade dabei bin meine Python Kentnisse etwas zu verbessern, hab ich mich mal kurz rangesetzt und ein kleines Script geschrieben:
Code:
#!/usr/bin/python

import sys, re

def main(argv):
    pattern = '(?P<ip>[0-9\.]+) \[(?P<time>.*)\] (?P<method>GET|POST) (?P<id>\w+) (?P<client>.*)'

    ids = {}
    ignore = set()
    file = open(argv[0], 'r')

    for line in file.readlines():
        match = re.match(pattern, line)

        if match:
            id = match.group('id')
            ip = match.group('ip')
            s = id + ip

            if s not in ignore:
                ignore.add(s)
                if id in ids: ids[id] += 1
                else: ids[id] = 1

    for item in ids.items(): print('{0}: {1}'.format(item[0], item[1]))


if __name__ == "__main__":
    main(sys.argv[1:])
Vorteil: Plattformunabhängigkeit.

@Reficul
Falls du es verwenden willst, einfach den Code in ne .py Datei schreiben.
Aufrufen kannst du es per:
Code:
name_des_scripts.py pfad/zum/logfile

Falls du kein Python installiert hast: https://www.python.org/downloads/
 
ich danke euch allen. habe gestern abend auch schon eine version von bagbag bekommen die gut funktioniert.
Aber auch allen anderen einen riesen Dank, werde mir die anderen auch mal angucken.

Gruß Adrian
 
Zurück
Oben