kreativblockade ...

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von belubaba, 05.07.2006.

  1. #1 belubaba, 05.07.2006
    belubaba

    belubaba Tripel-As

    Dabei seit:
    20.09.2005
    Beiträge:
    184
    Zustimmungen:
    0
    Hallo Zusammen,

    ich will per Skript die Fehlermeldungen aus einem Webserverlogfile auslesen und zusammenfassen.

    Momentan bin ich bei:

    grep 'GET[ ]*[45][0-9][0-9]' meinlogfile.log

    Damit hab ich schon mal alle 400er und 500er Meldungen.

    Aber irgendwie fällt mir kein Ansatz ein wie ich alle doppelten Meldungen rausschmeiße ...

    Hat jemand eine Idee?

    b.
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 05.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Vieleicht solltest du mit einfach ein sort | uniq hintendran hängen.

    ;)
    Gruß Wolfgang
     
  4. #3 belubaba, 05.07.2006
    belubaba

    belubaba Tripel-As

    Dabei seit:
    20.09.2005
    Beiträge:
    184
    Zustimmungen:
    0
    Danke. Das war schon mal ein guter tipp.

    Mein Statement sieht jetzt so aus:

    grep 'GET[ ]*[45][0-9][0-9]' *|cut -f2-9 -d'/'|sort|uniq

    Damit bekomme ich schon mal alle Fehlermeldungen uniq und sortiert.

    Aber ich hätte noch gerne den zugehörigen Fehlercode.
    Die Zeilen sehen in etwa so aus:

    accesslog123:06:30:45 GET 500 0.0034 1316 /myfolder/meinfile.htm

    Den Teil kriege ich mit dem Statement

    /myfolder/meinfile.htm

    Und den teil will ich

    500 /myfolder/meinfile.htm


    Unglücklicherweise habe ich die 500 schon rausgeschnitten ...

    b
     
  5. #4 Wolfgang, 05.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Code:
    $ echo accesslog123:06:30:45 GET 500 0.0034 1316 /myfolder/meinfile.htm|sed -e 's/^.*GET \([4,5][^ ]*\)[^/]*\([/][^ ]*\).*$/\1 \2/g'
    500 /myfolder/meinfile.htm
    
    Jetzt noch ein sort -t" " +1|uniq (nach dem zweiten Feld sortiert) hintendran und fertisch ;)
    man sort
    Gruß Wolfgang
     
  6. #5 belubaba, 05.07.2006
    belubaba

    belubaba Tripel-As

    Dabei seit:
    20.09.2005
    Beiträge:
    184
    Zustimmungen:
    0
    Danke das probier ich mal aus.

    Ich bin zwischenzeitlich auf folgenden code gekommen der auch funktioniert

    grep 'GET[ ]*[45][0-9][0-9]' */*|cut -f2,3,6 -d' '|sort|uniq

    gruß

    b.
     
  7. #6 Wolfgang, 05.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Das geht natürlich auch.
    Allerdings fängst du so das GET mit ein, und du möchstest dann lieber nach dem zweiten und dritten Feld sortieren.

    Gruß Wolfgang
     
  8. #7 belubaba, 06.07.2006
    belubaba

    belubaba Tripel-As

    Dabei seit:
    20.09.2005
    Beiträge:
    184
    Zustimmungen:
    0
    kreativblockade2

    Das gestern hat schonmal klasse funktioniert.

    Mein heutiges Problem kollidiert mit meinen fehlenden sed Kenntnissen.

    Falls mir jemand einen hint geben könnte welchen Ansatz ich hierfür wählen sollte wäre ich dankbar.

    Ich habe eine Logdatei deren einzelne Fehlermeldungen immer mit "####" anfangen. Entweder beginnt die nächste Zeile mit "Error Message:" oder mit "java.lang.*Exception".

    Ich würde gerne erstmal aus n Dateien alle "Error Message:" in einer Datei sammeln und alle "java.lang.*Exception" in einer anderen.

    Per ksh Skript könnte ich das lösen, aber das ist etwas umständlich.

    Gibt es da eine schnelle sed Lösung?

    Gruß

    b.
     
  9. #8 Wolfgang, 06.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Du wirst dabei nicht um eine Fallunterscheidung per Shellscript herumkommen.
    sed ist ja ein Streameditor, der zwar den Datenstrom manipulieren kann, nicht aber dessen Ausgabekanäle.
    Du kannst sed dazu verwenden, die bestimmten Zeilen auszugeben, nicht aber in verschiedene Dateien.
    um z.B. nur den Wert unmittelbar hinter ##### in eine Variable zu schreiben:
    Code:
    sed -ne '/^#####/!d;/^#####/{N;s/^#####\n//;p}' inputfile | while read MSG;
     do 
    if [ $(echo $MSG|egrep ^Error) ]; 
    then 
    echo "Schreibe in Datei1";
    echo $MSG>>Datei_1;
    
    elif [ $(echo $MSG|egrep ^java ) ] ;
    then
    echo "Schreibe in Datei 2";
    echo "$MSG >>DATEI_";
    fi;
     done 
    
    Gruß Wolfgang
     
  10. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  11. #9 belubaba, 07.07.2006
    belubaba

    belubaba Tripel-As

    Dabei seit:
    20.09.2005
    Beiträge:
    184
    Zustimmungen:
    0
    Danke für die Unterstützung. Ich habe die Vorsortierung zwar inzwischen anders umgesetzt aber der Code hier hilft mir trotzdem weiter.

    Allerdings gibt der sed bei mir ein "Command garbled" zurück.
    Liegt das daran das ich die ksh benutze?

    Gruß

    b.
     
  12. #10 Wolfgang, 07.07.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo
    Hm :think: kann ich im Moment nix dazu sagen, ich habe keine ksh.
    Bist du dir sicher, dass der Fehler vom sed kommt?
    Ich habe das mal kurz getestet unter der bash mit GNU sed Version 4.1.4

    Was passiert, wenn du die Daten zu Fuß an sed verfütterst mit dem sed-befehl?

    Was mein sed macht, ist schnell erklärt:
    Wenn du natürlich mehr als 5 x # hast, oder kein \n nach dem letzten folgt, dann ist wohl s/^#####.*\n//g besser.

    Gruß Wolfgang
     
Thema:

kreativblockade ...