
Hola tengo un archivo de texto que contiene la siguiente información:
#[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
Quiero obtener la --End
línea Return
y la Elapsed
línea si su retorno correspondiente es >
0.
Hasta ahora solo he podido acceder a la línea de retorno.grep "#RETURN:" -A 1 -B 1 f.log
¿Pero cómo hago grep solo si el retorno es >
0?
Salida deseada:
#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55
Respuesta1
Con 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}
: Si la línea termina enEND
, guárdela como variableprev
y pase a la siguiente línea; Esta es la línea anteriorRETURN
/^#RETURN/ && $2>0 {cur=$0; pr=1; next}
: Si la línea comienza con#RETURN
y el segundo campo es mayor que 0, guarde la línea comocur
, establezca la variablepr
como 1 (verdadero) y vaya a la siguiente línea.pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}
: Sipr
es verdadero, imprima el resultado en el formato deseado y finalmente configúrelopr
como 0 (falso)
Ejemplo:
% 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
Respuesta2
puedes probar esto;
awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
P.ej;
user@host:/tmp$ awk -F: '/#RETURN:/ && $2 > 0 { getline; print $0}' test
#ELAPSED TIME (in seconds): 55
Respuesta3
Deberías usar expresiones regulares en tu grep
:
grep -C1 'RETURN: [1-9][0-9]*' input.txt
Esa expresión regular debería capturar cualquier número (positivo) que no sea un solo 0 (o que no comience con un 0).