In einer Datei recordweise rückwärts lesen

DÖXIE

DÖXIE

Mitglied
Hallo,

ich habe folgende Herausforderung (cygwin)
Ich lese eine Logdatei und suche darin nach einem bestimmten formatierten Eintrag (z.B. eine Fehlernummer).
(Das funktioniert auch ohne Probleme)
Wenn ich diesen Eintrag gelesen habe muss ich einen dazugehörigen Eintrag auslesen, welcher 4 Zeilen davor steht.
Wie realisiere ich das ?
Danke für Eure Hilfe !!
 
Hi

Wie ließt du die Datei? Zeilenweise? Dann könntest für jede Zeile eine Variable +1 schreiben und dann die Varialbe - 4 rechnen.
Diese berechnete Zeile kannst du dann mit head -n10 text.txt oder sed -n '10p' test.txt (wobei 10 für die Zeilennummer steht) ansprechen.
Gibt bestimmt noch eine elegantere Variante die aktuelle Zeilennummer auszugeben ohne eine Varible hoch zu zählen, fällt mir jedoch gerade nichts ein.
 
Hi

Wie ließt du die Datei? Zeilenweise? Dann könntest für jede Zeile eine Variable +1 schreiben und dann die Varialbe - 4 rechnen.
Diese berechnete Zeile kannst du dann mit head -n10 text.txt oder sed -n '10p' test.txt (wobei 10 für die Zeilennummer steht) ansprechen.
Gibt bestimmt noch eine elegantere Variante die aktuelle Zeilennummer auszugeben ohne eine Varible hoch zu zählen, fällt mir jedoch gerade nichts ein.

Ich lese die Datei mit "cat" und suche mit "grep"
 
Code:
#!/bin/bash
zeile=$(expr $(grep -n 5 test.txt | cut -d: -f1) - 4)
head -n$zeile test.txt

Bei grep musst du den Suchstring noch anpassen. grep -n gibt dir die Zeilennummer mit aus.
 
Vielen Dank - Ich werde es versuchen !!

Ich bekomme es nicht hin :(

Also, die Fehlerdatei hat unter anderem folgenden Inhalt:

2012-06-05 06:07:30,253 INFO 1.Nachricht, die die Datei 20120604093743-C2TC2333-RPE.xml enthält, wird versendet.
2012-06-05 06:07:30,644 INFO Die Message-ID lautet: bdr128_1338869250547_266666
2012-06-05 06:07:31,175 WARN 3703 Signierzertifikat eines Autors ist widerrufen
2012-06-05 06:07:31,175 ERROR Vom Intermediär wurde keine Annahmebestätigung der Nachricht zurückgesandt. Fehler: 9705
2012-06-05 06:07:31,175 ERROR OSCI-Nachricht wurde nicht gesendet.
2012-06-05 06:07:31,175 INFO 2.Nachricht, die die Datei 20120604111856-C2TH4202-RPE.xml enthält, wird versendet.
2012-06-05 06:07:31,582 INFO Die Message-ID lautet: bdr128_1338869251418_266667
2012-06-05 06:07:32,175 WARN 3703 Signierzertifikat eines Autors ist widerrufen
2012-06-05 06:07:32,175 ERROR Vom Intermediär wurde keine Annahmebestätigung der Nachricht zurückgesandt. Fehler: 9705
2012-06-05 06:07:32,175 ERROR OSCI-Nachricht wurde nicht gesendet.
2012-06-05 06:07:32,175 INFO 3.Nachricht, die die Datei 20120604155431-C2TM5712-RP.xml enthält, wird versendet.
2012-06-05 06:07:32,535 INFO Die Message-ID lautet: bdr128_1338869252416_266668
2012-06-05 06:07:33,066 WARN 3703 Signierzertifikat eines Autors ist widerrufen
2012-06-05 06:07:33,066 ERROR Vom Intermediär wurde keine Annahmebestätigung der Nachricht zurückgesandt. Fehler: 9705
2012-06-05 06:07:33,066 ERROR OSCI-Nachricht wurde nicht gesendet.
usw.

Ich suche mit grep nach dem Eintrag "Signierzertifikat". Diesen finde ich in den Zeilen 3 und 8 und 13 (es können natürlich viel mehr sein).
Ich benötige aber den dazugehörigen Eintrag für die XML-Datei. Diese stehen in den Zeilen 1 und 6 und 11.
Ich muss also irgendwie im "Pilgerschritt" die ganze Logdatei durchforsten.
Wie kann ich das lösen ?
 
Hi,

wenn es reicht, beim Lesen des Logfiles die xml-Dateien zu merken, und die zuletzt gefundene dann einfach ausgegeben werden soll, wenn du auf eine Meldung mit 'Signierzertifikat' triffst, könnte das etwa so laufen:
Code:
sed -n -e '/xml/h' -e '/Signierzertifikat/{x;p}'
Vorteil dabei wäre, dass die Datei nur einmal gelesen werden muss ...

Gruss, A.
 
vielen Dank für die Antwort,

das Problem ist, dass ich nur dann den Namen der XML-Datei (zwei Zeilen höher) brauche, wenn mit dieser ein Problem auftrat.
Oder umgekehrt: immer dann, wenn ich in der Logdatei den Eintrag "3703 Signierzertifikat eines Autors ist widerrufen" finde, benötige ich den Namen der XML-Datei zwei Zeilen vorher !!
Da ich die Logdatei nur einmal am Tag lesen möchte, können mehrere XML-Namen vorkommen (wie in meinem Beispiel).
 
Code:
grep -B 2 "WARN 3703" DEINE_FEHLERDATEI | grep -o "[^ ]*\.xml"
Ergibt:
Code:
20120604093743-C2TC2333-RPE.xml
20120604111856-C2TH4202-RPE.xml
20120604155431-C2TM5712-RP.xml
 
Guten Morgen "floyd62" und "Spröde",

vielen Dank für Eure Hilfe !!

Eure Scripte funktionieren tadellos und haben mir sehr geholfen.

Super gemacht !

Grüße,
P
 
Ihr Lieben,

leider benötige ich nochmals Eure Hilfe
ich suche in meiner Datei mit folgenden Befehl:
cat message_id1.txt | sed -n -e '/govapp/h' -e '/L2ZK1164/{x;p}' >>message_id2.txt

Jetzt möchte ich aber einen Suchbegriff als Variable verwenden

In meinem Script erfolgt am Anfang ein read: read BHKZ - Die Eingabe ist dann L2ZK1164

Jetzt soll diese Eingabe an sed übergeben werden !
Das bekomme ich leider nicht hin.
 
Code:
... -e [COLOR="#FF0000"]"[/COLOR]/[COLOR="#FF0000"]$BHKZ[/COLOR]/{x;p}[COLOR="#FF0000"]"[/COLOR]
Doppelte Anführungszeichen benutzen.
 
Guten Morgen "Spröde",

super, es funktioniert - ich habe mir schon die Finger gebrochen !
Vielen Dank !!
 

Ähnliche Themen

Werte aus Dateien lesen

3 letzte Zeile löschen oder ab Zeile 55 Muster suchen und löschen

Sehr große Datei in Teilschritten auslesen.

Eine bestimmte Zeile aus .txt-Datei lesen

Filenamen aus Datei auslesen und weiterverarbeiten

Zurück
Oben