subprcess.popen mit Listen

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
noni
User
Beiträge: 4
Registriert: Freitag 3. Juli 2020, 13:51

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)
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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:

Code: Alles auswählen

for element in list:
Ich an deiner Stelle würde das gzip Modul aus der Standard-Bibliothke verwenden statt ein externes Kommando zu verwenden.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
noni
User
Beiträge: 4
Registriert: Freitag 3. Juli 2020, 13:51

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.
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.
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?
Benutzeravatar
__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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten