Guten Tag,
ich habe folgendes Problem:
ich habe eine Reihe von Logs gesucht, die z.b. 5 Tage her sind, diese logs habe ich dann in eine Liste gespeichert. Z.B:
syslog.2.gz
syslog.3.gz
Nun will ich im folgenden, die Dateien lesen und dann nach einem Datum und einer Uhrzeit suchen, dies steht schon im richtigen Format in der Variable "absoluttime"
damit ich aber auch in den .gz Dateien lesen kann und gegebenfalls die auch löschen kann, gebe ich sie mir mit zcat aus. Ich bekomme so zwar keine Fehlermeldung. Wenn ich aber mir dann "out2" ausgeben möchte, steht da leider nichts drin. Im Internet habe ich so jetzt nichts gefunden. Kann mir da vielleicht jemand weiterhelfen?
i = 0
for i in range(1, len(list)):
print("Das ist es nun", list)
var = subprocess.Popen('zcat %s | grep %s' %(list,absoluttime), stderr=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
out2, err = var.communicate()
i = i + 1
print(out2)
subprcess.popen mit Listen
Bitte setze deinen Code in Code-Tags. Die erscheinen wenn man den </>-Button drückt, wenn man den "Vollständigen Editor & Vorschau" benutzt.
Eine for-Schleife mit range ist ist in Python ein Anti-Pattern. Stattdessen iteriert man direkt über die Elemente der Liste:
Ich an deiner Stelle würde das gzip Modul aus der Standard-Bibliothke verwenden statt ein externes Kommando zu verwenden.
Eine for-Schleife mit range ist ist in Python ein Anti-Pattern. Stattdessen iteriert man direkt über die Elemente der Liste:
Code: Alles auswählen
for element in list:
Zum Arbeiten mit gezippten Dateien gibt es das gzip-Modul, dafür benutzt man keine externen Programme.
Über einen Index iteriert man nicht, sondern über die Elemente der Liste direkt. Das i=0 und i = i + 1 sind zusätzlich ziemlich sinnlos, weil Du eine for-Schleife hast.
var ist ein sehr schlechter Name für ein POpen-Objekt.
list ist der Name des eingebauten List-Typs, der sollte nicht mit irgendwelchen Daten überschrieben werden.
Über einen Index iteriert man nicht, sondern über die Elemente der Liste direkt. Das i=0 und i = i + 1 sind zusätzlich ziemlich sinnlos, weil Du eine for-Schleife hast.
var ist ein sehr schlechter Name für ein POpen-Objekt.
list ist der Name des eingebauten List-Typs, der sollte nicht mit irgendwelchen Daten überschrieben werden.
Vielen Dank! Ich hab das jetzt auch hinbekommen und konnte auch dann in den Dateien löschen. Nur habe ich jetzt keine gegebene Delete Funktion gefunden.Sirius3 hat geschrieben: Dienstag 4. August 2020, 14:55 Zum Arbeiten mit gezippten Dateien gibt es das gzip-Modul, dafür benutzt man keine externen Programme.
Über einen Index iteriert man nicht, sondern über die Elemente der Liste direkt. Das i=0 und i = i + 1 sind zusätzlich ziemlich sinnlos, weil Du eine for-Schleife hast.
var ist ein sehr schlechter Name für ein POpen-Objekt.
list ist der Name des eingebauten List-Typs, der sollte nicht mit irgendwelchen Daten überschrieben werden.
Also wenn ich zum Beispiel sage ich möchte die Log-Einträge vom 30. Juli um 15:00 löschen, kann ich die nicht so einfach damit löschen richtig?
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@noni: Richtig. Etwas aus Textdateien löschen, und das gilt auch für komprimierte Textdateien, heisst das man die Datei neu schreiben muss, ohne die Zeilen die man nicht mehr haben möchte.
Um das robust zu machen, schreibt man üblicherweise erst in eine Temporäre Datei im gleichen Verzeichnis und benennt am Ende die neue Datei in die alte um. Sonst kann es bei Programmabbruch passieren, dass Daten verloren gehen.
Das mit dem ``grep`` funktioniert übrigens auch nur wenn man sicherstellt, dass das Muster nur an der richtigen Stelle gesucht wird. Wenn da also nur nach "Jul 30 15:00:00", ohne das am Zeilenanfang zu verankern, könnte das auch Zeilen erfassen wo dieser Wert woanders innerhalb der Zeile steht. Wenn man das in Python ausdrückt, sollte man `startswith()` verwenden und nicht den ``in``-Operator.
Um das robust zu machen, schreibt man üblicherweise erst in eine Temporäre Datei im gleichen Verzeichnis und benennt am Ende die neue Datei in die alte um. Sonst kann es bei Programmabbruch passieren, dass Daten verloren gehen.
Das mit dem ``grep`` funktioniert übrigens auch nur wenn man sicherstellt, dass das Muster nur an der richtigen Stelle gesucht wird. Wenn da also nur nach "Jul 30 15:00:00", ohne das am Zeilenanfang zu verankern, könnte das auch Zeilen erfassen wo dieser Wert woanders innerhalb der Zeile steht. Wenn man das in Python ausdrückt, sollte man `startswith()` verwenden und nicht den ``in``-Operator.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari