Líneas grep antes y después si el valor de una cadena es mayor que cero

Líneas grep antes y después si el valor de una cadena es mayor que cero

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 --Endlínea Returny la Elapsedlí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 en END, guárdela como variable prevy 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 #RETURNy el segundo campo es mayor que 0, guarde la línea como cur, establezca la variable prcomo 1 (verdadero) y vaya a la siguiente línea.

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}: Si pres verdadero, imprima el resultado en el formato deseado y finalmente configúrelo prcomo 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).

información relacionada