
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
, Return
deren Elapsed
entsprechende 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 endetEND
, speichern Sie sie als Variableprev
und gehen Sie zur nächsten Zeile. Dies ist die Zeile vorRETURN
/^#RETURN/ && $2>0 {cur=$0; pr=1; next}
: Wenn die Zeile mit beginnt#RETURN
und das zweite Feld größer als 0 ist, dann speichere die Zeile alscur
, setze die Variablepr
auf 1 (wahr) und gehe zur nächsten Zeilepr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}
: Wennpr
wahr ist, dann drucke die Ausgabe im gewünschten Format und setze sie abschließendpr
auf 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).