Python Log Einträge filtern und wieder ausgeben

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kato1998
User
Beiträge: 3
Registriert: Donnerstag 2. März 2023, 21:23

Hey Hey,
da mir letztes mal schon super hier geholfen wurde, versuche ich es noch mal :D

Ich möchte ein Programm schreiben welches eine log Datei ausließt und mir nur bestimmte Informationen zurückgibt.



Ein Teil meiner Log Datei:
Name5/0/2 is up, line protocol is up (verbunden)
Letzter input 00:01:33, output 00:00:06, abc abc abc
Name5/0/2 is down, line protocol is down (getrennt)
Letzter input 20w0d, output 20w0d, abc abc abc
Name5/0/3 is down, line protocol is down (getrennt)
Letzter input never, output never, abc abc abc
Name4/0/4 is down, line protocol is down (getrennt)
Letzter input never, output never, abc abc abc
Name3/0/5 is down, line protocol is down (getrennt)
Letzter input never, output never, abc abc abc
Name2/0/8 is down, line protocol is down (getrennt)
Letzter input 18:30:15, output 18:29:38, abc abc abc
Name1/0/9 is up, line protocol is up (verbunden)
Letzter input 1w2d, output 00:00:06, abc abc abc
Name2/0/10 is up, line protocol is up (connected)
Letzter input 00:00:41, output 00:00:06, abc abc abc
Name3/0/2 is down, line protocol is down (getrennt)
Letzter input 20w0d, output 20w0d, abc abc abc
Name1/0/11 is administratively down, line protocol is down (getrennt)
Letzter input never, output never, abc abc abc
Name2/0/22 is down, line protocol is down (getrennt)
Letzter input 2d21h, output 2d20h, abc abc abc
Name1/1/1 is down, line protocol is down (getrennt)
Letzter input never, output never, abc abc abc
Immer zwei Einträge gehören zusammen. also z.B. :
Name5/0/2 is up, line protocol is up (verbunden)
Letzter input 00:01:33, output 00:00:06, abc abc abc
Folgendes Programm löscht mir alle Einträge die "up" sind und schreibt sie mir in eine neue Datei :

Code: Alles auswählen


with open("D:\Programm\Auswertung.txt", encoding="utf8") as zeilen:
    daten = []
    skip_next = False
    for zeile in zeilen:
        if skip_next:
            skip_next = False
        else:
            teile = zeile.split(" ")
            if "up" in teile[2]:
                skip_next = True
            else:
                daten.append(teile)


with open("D:\Programm\Ergebniss.txt",'w') as ergebniss:
    for item in daten:
        ergebniss.write("%s\n" % item)

Nun möchte ich aber noch alle Einträge löschen :

Deren Letzter Input vor weniger als 10 Wochen war , also z.B. diesen :
Name2/0/22 is down, line protocol is down (getrennt)
Letzter input 2d21h, output 2d20h, abc abc abc
da es im log aber als Zeitangabe d, w oder auch eine Uhrzeit sein kann, habe ich keine Ahnung wie ich dies tun soll.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was hast du denn bisher versucht?
Der Code ist ja 1:1 der, den man dir in dem anderen Thread geschrieben hat. Also bisher eher keine Eigenleistung.

Grundsätzlich musst du dir die einzelnen Zeilen anschauen und dann Fallunterscheidungen machen. if und split steht ja schon in deinem Code. Das zu verwenden wäre doch schon ein guter Einstieg...
Kato1998
User
Beiträge: 3
Registriert: Donnerstag 2. März 2023, 21:23

sparrow hat geschrieben: Montag 6. März 2023, 19:52 Was hast du denn bisher versucht?
Der Code ist ja 1:1 der, den man dir in dem anderen Thread geschrieben hat. Also bisher eher keine Eigenleistung.

Grundsätzlich musst du dir die einzelnen Zeilen anschauen und dann Fallunterscheidungen machen. if und split steht ja schon in deinem Code. Das zu verwenden wäre doch schon ein guter Einstieg...

Unteranderem habe ich schon das Probiert (hier werden never und administratively auch abgefragt):

Code: Alles auswählen

def pruefenzeileoben():

    with open("G:\Programm\Auswertung.txt", encoding="utf8") as zeilen: #Prüft die obere Zeile 
        daten = []
        skip_next = False
        for zeile in zeilen:
            if skip_next:
                skip_next = False
            else:
                teile = zeile.split(" ")
                if "up" in teile[2]:#Prüft nach up in der Zeile
                    skip_next = True
                elif "administratively" in teile[2]:#Prüft nach administrativly in der Zeile
                    skip_next = True
                else:
                    daten.append(teile)
    return daten


def pruefenzeileunten(daten): #Prüft die zweite zeile
    daten_neu = []
    skip_next = True
    for zeile in daten:
        if skip_next:
            skip_next = False
        else:
            teile = zeile.split(" ")
            if "w" in teile[5]: #Prüft nach w in der Zeile
                daten_neu.append(teile)
            elif "never" in teile[5]: #Prüft nach never in der Zeile
                daten_neu.append(teile) 
            else:
                skip_next = True
                
    return daten_neu

daten = pruefenzeileoben
daten_neu = pruefenzeileunten (daten)




with open("G:\Programm\Ergebniss.txt",'w') as ergebniss:
    for item in daten_neu:
        ergebniss.write("%s\n" % item)
Hier bekomme ich es zwar nicht hin, die genauen Wochen abzufragen, aber zu mindestens alles rauszufiltern was keine Wochen sind , läuft aber nicht.

Ich bekomme folgenden Fehler beim Start
Traceback (most recent call last):
File "g:\Programm\main.py", line 41, in <module>
daten_neu = pruefenzeileunten (daten)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "g:\Programm\main.py", line 25, in pruefenzeileunten
for zeile in daten:
TypeError: 'function' object is not iterable
Benutzeravatar
__blackjack__
User
Beiträge: 14065
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kato1998: `daten` ist nicht das was Du denkst was es ist. Was es tatsächlich ist, steht ja sogar in der Fehlermeldung: eine Funktion. `pruefezeileoben` ist eine Funktion. Und wenn man ``daten = pruefezeileoben`` schreibt, dann steht der Name `daten` für die gleiche Funktion. Was eigentlich nicht weiter überraschen sollte, denn das ist die Bedeutung von einer Zuweisung. Der Wert des Ausdrucks auf der rechten Seite des ``=`` wird dem Namen auf der linken Seite zugewiesen.

Was Du an der Stelle machen willst ist die Funktion *aufrufen* und das Ergebnis an `daten` zu binden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten