Grep-Zeilen vor und nach, wenn der Wert einer Zeichenfolge größer als Null ist

Grep-Zeilen vor und nach, wenn der Wert einer Zeichenfolge größer als Null ist

Hallo, ich habe eine Textdatei mit den folgenden Informationen:

#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

Ich möchte die Zeile und die Zeile abrufen --End, Returnderen Elapsedentsprechende Rückgabe >0 ist.

Bisher konnte ich nur die Return-Zeile greppengrep "#RETURN:" -A 1 -B 1 f.log

Aber wie kann ich nur greppen, wenn die Rückgabe >0 ist?

Gewünschte Ausgabe:

#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

Antwort1

Mit awk:

awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next};\
                      pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
  • /END$/ {prev=$0; next}: Wenn die Zeile mit endet END, speichern Sie sie als Variable prevund gehen Sie zur nächsten Zeile. Dies ist die Zeile vorRETURN

  • /^#RETURN/ && $2>0 {cur=$0; pr=1; next}: Wenn die Zeile mit beginnt #RETURNund das zweite Feld größer als 0 ist, dann speichere die Zeile als cur, setze die Variable prauf 1 (wahr) und gehe zur nächsten Zeile

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}: Wenn prwahr ist, dann drucke die Ausgabe im gewünschten Format und setze sie abschließend prauf 0 (falsch).

Beispiel:

% cat file.txt                                                                                                                   
#[Tue Oct 25 00:00:02 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

#[Tue Oct 25 00:05:01 2016] --- START OUTPUT
#CMD: XXX
END-->0<--
#[Tue Oct 25 00:05:33 2016] --- END
#RETURN: 0
#ELAPSED TIME (in seconds): 32

% awk '/END$/ {prev=$0; next}; /^#RETURN/ && $2>0 {cur=$0; pr=1; next}; pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}' file.txt
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55

Antwort2

Sie können dies versuchen;

awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test

Z.B;

user@host:/tmp$ awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
#ELAPSED TIME (in seconds): 55

Antwort3

Sie sollten in Folgendem reguläre Ausdrücke verwenden grep:

 grep -C1 'RETURN: [1-9][0-9]*' input.txt

Dieser reguläre Ausdruck sollte alle (positiven) Zahlen erfassen, die nicht aus einer einzelnen 0 bestehen (oder nicht mit einer 0 beginnen).

verwandte Informationen