chriss: Zeilen löschen, wenn bestimmte Zeichen vorkommen

Hi,

ich habe eine log.txt mit folgenden Muster.

donnerstag - 0000 - team
dienstag - 1111 - team
sonntag - 0000 - gruppe
montag - 3333 - team

Ich möchte die Zeilen löschen, welche "0000" enthalten und die Datei danach wieder speichern. Ein Codesnippsel als Beispiel wäre schön! Danke.

Gruß
chriss

  1. Hi,

    Ich möchte die Zeilen löschen, welche "0000" enthalten und die Datei danach wieder speichern.

    bitte sehr. Datei einlesen, gemäß Deiner Definition des Begriffes "Zeile" aufteilen, Datei neu und unter Auslassung der ungewollten Zeilen schreiben. Dabei die Problematik paralleler Zugriffe beachten und lösen.

    Ein Codesnippsel als Beispiel wäre schön! Danke.

    Bei solchen Äußerungen wäre es angebracht, Deine Preisvorstellung mit zu nennen.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi!

      Bei solchen Äußerungen wäre es angebracht, Deine Preisvorstellung mit zu nennen.

      Stand doch im OP: es geht um "0000".

      off:PP

      --
      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  2. Hi!

    Ein Codesnippsel als Beispiel wäre schön! Danke.

    Ein Möglichkeit wäre:

      
    if (strstr(...  
    
    

    http://de.php.net/manual/en/function.strstr.php

    off:PP

    --
    "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
  3. 'ǝɯɐu$ ıɥ

    Du willst dich also mit file(); beschäftigen, dannach kannst du dich an den Arrayfunktionen austoben.

    ssnɹƃ
    ʍopɐɥs

    --
    I like children. If they're properly cooked.
    - W.C. Fields
  4. Hi,

    Ein Codesnippsel als Beispiel wäre schön!

    Eigeninitiative auch!

    MfG ChrisB

    --
    The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
  5. Moin!

    $arOut=[link:http://de.php.net/manual/de/function.array.php@title=array()];  
    [link:http://de.php.net/manual/de/control-structures.foreach.php@title=foreach]([link:http://de.php.net/manual/de/function.file.php@title=file]('log.txt') as $str) {  
        if (! false === [link:http://php.net/manual/de/function.strpos.php@title=strpos]($str, '0000')) {  
            $arOut[]=$str; # Zuweisung des Strings an das aktuelle Element des arrays, zum nächsten Element gehen.  
        }  
    }  
    [link:http://de.php.net/manual/de/function.file-put-contents.php@title=file_put_contents]('log.txt', implode("\n", $arOut)); # Zeilenende für Linux/Unix, sonst "\r\n"  
    [link:http://de.php.net/manual/de/function.unset.php@title=unset] ($arOut);
    

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Moin fastix,

      vielen Dank für deine Hilfe, aber leider klappt es irgendwie nicht so richtig. (Es handelt sich auch um IP Adressen mit dem Muster 000.000.000.000 und ich möchte nach den ersten zwei Stellen filtern (z.B. 123.987) Die Zeilen, in denen diese Zahlen vorkommen, sollen gelöscht werden. Damit möchte ich meine eigenen IP-Adressen aus der Log-Datei löschen, um möglicht übersichtlich die wirklichen Besucher zu erhalten.

      Viele Grüße
      chriss

      1. Hi,

        leider klappt es irgendwie nicht so richtig.

        Das kann passieren, wenn du hier nicht dein eigentliches Problem beschreibst.

        Und dass „funzt nich“ hier als Problembeschreibung auch nicht taugt, hast du auch bereits gelesen, *bestätigt* gelesen zu haben.

        (Es handelt sich auch um IP Adressen mit dem Muster 000.000.000.000 und ich möchte nach den ersten zwei Stellen filtern (z.B. 123.987)

        Na dann kannst du nicht einfach nach Zeilen suchen, die "0000" enthalten (ja, ich weiß, war ein Beispiel von dir - aber ein extrem blödes); nach "123.987" zu suchen bringt aber genauso wenig, weil das könnte ja auch in der Mitte oder am Ende der IP-Adresse stehen.

        Die Zeilen, in denen diese Zahlen vorkommen, sollen gelöscht werden.

        Nein, sollen sie offenbar nicht, siehe oben.

        Wenn davor immer ein Leerzeichen steht - dann kannst du nach " 123.987." suchen, denn das ist dann immer der Anfang der IP-Adresse. Das gilt natürlich nur, wenn nicht noch andere Bestandteile der Zeile das gleiche Format haben können, dann bedürfte es schon eines etwas ausgereifteren Ansatzes.

        So, und jetzt beschreibst du dein Problem mit der Umsetzung bitte noch mal vernünftig: Welchen Code hast du verwendet, *was* „funzt“ damit nicht wie beabsichtigt, und welche Schritte hast du bisher schon unternommen, um dem Problem auf die Schliche zu kommen ...?

        MfG ChrisB

        --
        The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]
      2. Moin!

        Damit möchte ich meine eigenen IP-Adressen aus der Log-Datei löschen, um möglicht übersichtlich die wirklichen Besucher zu erhalten.

        * Dann muss es kein PHP kein.
        * Dann muss es nicht die selbe Datei sein.

        Lösung für Linux, string, Pfade und Dateinamen ggf. anpassen.

        grep -v " 123.234" /var/log/apache2/access_log > /tmp/access_log.filtered
        less /tmp/access_log.filtered

        Beschreibe künftig Dein Problem, nicht irgend ein anderes.
        grep und andere sehr nützliche Programme gibt es auch für Windows.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix

  6. Hi,

    ich habe eine log.txt mit folgenden Muster.

    donnerstag - 0000 - team
    dienstag - 1111 - team
    sonntag - 0000 - gruppe
    montag - 3333 - team

    Wenn Du das Logformat selbst festlegen kannst, definiere Felder, das macht ein Parsen einfacher. Zum Feldbegriff, Beispiel:

    Wochentag => 10 Zeichen usw. Es wäre noch zu klären ob Du byte- oder zeichenorientiert arbeitest, sofern da nur ascii-Zeichen reinkommen, ist ein byte ein Zeichen, da ist das egal.

    Hotti

    1. Hi!

      ich habe eine log.txt mit folgenden Muster.

      donnerstag - 0000 - team
      dienstag - 1111 - team
      sonntag - 0000 - gruppe
      montag - 3333 - team

      Wenn Du das Logformat selbst festlegen kannst, definiere Felder, das macht ein Parsen einfacher.

      Einfacher gehts mit PHP ja nun wirklich nicht: explode() mit ' - ' als Trennzeichen je Zeile.
      Felder der Länge X, Y und Z erfordern drei Teilstringermittlungen. Das ist nicht so wahnsinnig viel mehr, aber man ist ja faul.

      Lo!

      1. hi,

        Einfacher gehts mit PHP ja nun wirklich nicht: explode() mit ' - ' als Trennzeichen je Zeile.
        Felder der Länge X, Y und Z erfordern drei Teilstringermittlungen. Das ist nicht so wahnsinnig viel mehr, aber man ist ja faul.

        Doch, es sind genau die Funktionen pack() und unpack() die bei solchen Sachen das Leben leichter machen und gegenüber explode u.a. zeichenorientierten Funktionen auch noch performanter tun.

        pack erzeugt je Zeile beispielsweise 3 Felder mit je 10 byte. Mit unpack hingegen legst Du einfach nur eine 3*10-byte-Schablone auf und bekommst die Werte wieder zurück. Je nach Schablone werden entweder Leerzeichen oder binäre Nullen aufgefüllt, damit die Feldlänge konstant ist. Wenn die Logdatei nur maschinenlesbar sein soll, können sogar die Zeilenumbrüche entfallen, da wird in dem Beispiel nicht zeilenweise gelesen sondern 30-byte-weise.

        Schöner Tach,
        Horst

        1. Hi!

          Doch, es sind genau die Funktionen pack() und unpack() die bei solchen Sachen das Leben leichter machen und gegenüber explode u.a. zeichenorientierten Funktionen auch noch performanter tun.

          Sie können das Leben auch verkomplizieren, weil die Logdatei im gepackten Zustand nicht mehr einfach zu lesen ist und man ein Unpackprogramm zum Auswerten braucht.

          Außerdem wäre zu klären, ob Performance eine Rolle spielt, was bei geringen Datenmengen eher nicht der Fall ist. Das Ändern von bereits bestehendem Code kann aufwendig sein. Und wenn das keine signifikanten Vorteile zu bringen verspricht, muss man da keine Arbeit investieren.

          Lo!

          1. hi1,

            Das Ändern von bereits bestehendem Code kann aufwendig sein.

            Bishier sah ich noch keinen Code (außer von fastix). Um überhaupt maln bischen Code zu schreiben:

            f1, f2, f3 = unpack "A10A10A10", zeile;

            wobei je Zeile 3 Felder mit je 10 byte zu lesen sind, das ist die Schablone. Die genaue Felddefinition findest Du in der Apache-Konfig (falls das eine Logdatei von apachen ist), die Schablone ist dann entsprechend anzupassen.

            Und wieder hab ich ein paar Tricks verraten zum Thema "Schneller, besser, höher, weiter, geschickter, eleganter, performanter, stilvoller, cpu-gefälliger, ram-freundlicher...". Das sind doch so die Sachen, mit denen hier einige Leute immer so glänzen wollen!?

            Ich verstehe Deine Diskussion nicht dedelfix :)

            Mach doch was Du willst,
            Horst

            1. Hi!

              Ich verstehe Deine Diskussion nicht dedelfix :)

              Du schlägst eine Lösung vor, von der du dir Vorteile versprichst. Und ich bewerte diese sowie zähle Eigenschaften auf, die sich nachteilig auswirken können, die du dabei vergessen hast.

              Lo!

            2. Hi,

              Und wieder hab ich ein paar Tricks verraten zum Thema "Schneller, besser, höher, weiter, geschickter, eleganter, performanter, stilvoller, cpu-gefälliger, ram-freundlicher...". Das sind doch so die Sachen, mit denen hier einige Leute immer so glänzen wollen!?

              Und während manche das auch schaffen, bleibt's bei dir meist beim Versuch.

              MfG ChrisB

              --
              The most exciting phrase to hear in science, the one that heralds new discoveries, is not “Eureka!” but “That's funny...” [Isaac Asimov]