Thorsten Steffen: Zeilen in Datei löschen, die bestimmten Begriff enthalten

Hi,
ich möchte aus einer Log-Datei per perl-script Zeilen löschen, die einen bestimmten Begriff enthalten.
Kann mir jemand sagen, wie ich die Datei zeilenweise einlese und nur die gefilterten Zeilen wegschreibe ?

Gruß und Danke
Thorsten

  1. Hallo Thorsten!

    Du hast zwei Möglichkeiten:

    Zum Einen kannst Du eine temporäre Datei anlegen und beim Einlesen mit RexExps abtesten, ob die Zeile gültig ist oder nicht. Ist sie gültig, wird sie in die temp-Datei übernommen, ansonsten nicht. Am Schluß wird die Temporäre Datei per löschen und umbenennen zur Hauptdatei.
    Die zweite Möglichkeit. Die erste Datei in ein Array übernehmen, dann das Array abarbeiten und die Datei dadurch neu aufbauen. (Dabei auch durch RexExps-Test die entsprechenden Zeilen wegfallen lassen.)

    Bis denne,
    Dennis

  2. Hallo Thorsten,

    ich möchte aus einer Log-Datei per perl-script Zeilen löschen, die einen bestimmten Begriff enthalten.

    Direkt die Zeilen zu löschen, ist glaube ich etwas arg umständlich ;-) Es gibt aber mehrere möglichkeiten das denoch durchzuführen:

    1. Alles auf einen Rutsch in ein Array einlesen, und dann das Array wieder auf die Datei zurückschreiben, und die nicht gewünschten Zeilen (Arrayelemente) einfach weglassen/überspringen.
    2. Die Datei öffnen, und nur die gewünschten Zeilen in ein Array lesen, welches anschließend wieder in die Datei geschrieben wird.

    Bei Beiden Varianten musst Du entweder die Datei zum Lesen öffnen/schliesen und anschließend wieder zum Überschreiben öffnen/schließen, oder die Datei zum Lesen und Schreiben öffenen, den Inhalt nach dem Einlesen löschen, und anschließend die gefilterte Version reinschreiben.
    Die letzte Version ist sicherlich vorzuziehen, da hier zusammen mit Filelocking wohl am ehesten gewährleistet ist, daß Dein Logger nicht versucht, zwischen Lesen und Schreiben des Filters einen Eintrag zu setzen.

    Für die Durchführung benötigst Du open(), flock(), while, <HANDLE>, print()/push(), unless, m/PATTERN/, close() in der richtigen Reihenfolge ;-))

    Gruß AlexBausW

    1. Hallo nochmal,

      Für die Durchführung benötigst Du open(), flock(), while, <HANDLE>, print()/push(), unless, m/PATTERN/, close() in der richtigen Reihenfolge ;-))

      Kaum hatte ich es abgeschickt, fiel mir auf, daß für Version 1) natürlich noch 'foreach' oder 'for' benötigt wird :-) (obwohl 'while' wohl auch geht, zumindest mit 'shift' ;-)

      Gruß AlexBausW