kreativblockade ...

belubaba

belubaba

Tripel-As
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.
 
Hallo

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

;)
Gruß Wolfgang
 
Wolfgang schrieb:
Hallo

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

;)
Gruß Wolfgang

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
 
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
 
Wolfgang schrieb:
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

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.
 
belubaba schrieb:
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.
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
 
kreativblockade2

Wolfgang schrieb:
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

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.
 
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
 
Wolfgang schrieb:
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

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.
 
belubaba schrieb:
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.
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:
  • -n gib nichts aus, was nicht explizit mit p ausgegeben wird
  • /^#####/!d alles was nicht mit ##### beginnt wird gelöscht
  • /^#####/{N;s/^#####\n//;p} wenn mit ##### beginnt , lade nächste Zeile in den Patternspace (N) und entferne die #####\n, gib anschließend aus.
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
 

Ähnliche Themen

Zeilen auslesen und anderer Stelle wieder einfügen

Keine grafische Oberfläche (Debian Installation)

[Gelöst] Suchen und ersetzen mit Hilfe mehrerer Parameter

Welches Linux/Unix für ehemaligen OSX Nutzer?

Samba 4 trennt sich beim Übertragen unter Windows7/10

Zurück
Oben