2017-11-21 9 views
0
saaa vcahJJ HKak vk  
Import xxx xXXXXX xxxx 
aaaa aaaa aaaa ffffff 
hhhhhh hhhhhh hhh hhh hhhhhh 
Error reading readStatus api 
aaa hhhh aaa aaaaa 
gggggggg ggggg xxxxxxxxxx 
uuuu hhhhhhhh fffffffff 
query run ends 
qidIdih II v iQE Iqe 

ich die 'Error' Zeichenfolge in der Datei enthalten, über Protokolle finden wollen und dann alle Informationen zwischen zwei Strings 'Import' und 'ends' verfügbar drucken. Wie kann ich dies tun mit grep/sed Versucht this aber nicht viel bekommen. Hinweis: Ich weiß nicht, wie viele Zeilen vorher und nachher sein werden. Es kann variieren von oben Probe, die ich zur Verfügung gestellt habegrep für Fehler und drucken alle Linien mit 2 Saiten oberhalb und unterhalb Fehler

+0

Können Sie nach, was haben Sie versucht? –

+0

awk '/^Fehler /' ORS = 'endet' file.txt --- aber ohne Erfolg –

+0

@tripleee, ich bin mir nicht sicher, es ist ein Duplikat. Zwischen zwei Marker ja, aber es gibt noch eine weitere Bedingung hier. –

Antwort

0

Greps -A 1 Option wird Ihnen eine Zeile nach; -B 1 gibt Ihnen eine Zeile vorher; und -C 1 kombiniert beide, um Ihnen eine Zeile sowohl vor als auch nach zu geben.

grep -C 1 "Error" <logfile> 

Wie pro Ihre Anforderung können Sie

sed -n '/Import/,/ends/p' filename 
+0

Entschuldigung dafür, in meiner Frage nicht klar zu sein, ich weiß nicht, wie viele Zeilen vorher und nachher sein werden. Es kann von der oben angegebenen Probe abweichen –

+0

gibt es keine Möglichkeit Überprüfen Sie speziell für "Import" und "endet" und grep den Inhalt zwischen diesen 2 –

+0

Ja .. Bearbeitete die Antwort. Bitte überprüfen Sie – Abhijeetk431

0

Wie wäre es bedienen-:

$ awk 'BEGIN{RS=ORS="ends\n"} /Error/' file 

RS der Eingangs voneinander zu trennen sind, die ends sein muss. ORS erhält den gleichen Wert für Ausgabezwecke. Ihr Beispiel hatte /^Error/, aber Error startet den Datensatz nicht (^).

+0

Wie gehe ich vor, wenn ich mehr Zeilen vor der 'Import'-Zeile habe? –

+0

Bitte aktualisieren Sie die Beispieldaten, um die tatsächliche Situation widerzuspiegeln. Das Raten von Spielen wird hier nicht geschätzt, da es Zeitverschwendung ist. –

0

Sie sind hier:

out=$(sed -n '/^Import/,/end$/p' file) 
echo "$out" | grep Error >/dev/null && echo "$out" 

Dadurch wird der Text zwischen „Import“ erfassen und „Ende“ und drucken Sie es nur, wenn die extrahierten Text „Error“ enthält.

+0

Das funktionierte für meine Anforderung. Vielen Dank –

0

können Sie versuchen, diese

sed '/^Import/!d;:A;N;/\nImport/{h;s/.*\n//;bA};/ends$/!bA;h;s/\nError//;tB;d;:B;x' infile 

Erläuterung sed:

sed ' 
/^Import/!d     # if a line start with Import 
:A 
N       # get an other line 
/\nImport/{h;s/.*\n//;bA} # if the last line start with Import 
          # keep only this last line and return to A 
/ends$/!bA     # If the last line end with ends 
h       # keep all the lines in the hold space 
s/\nError//     # look for a line which start with Error 
tB       # if find jump to B 
d       # not find, delete all and return to the start 
:B 
x       # restore all the lines and print 
' infile 
Verwandte Themen