Linhas Grep antes depois se o valor de uma string for maior que zero

Linhas Grep antes depois se o valor de uma string for maior que zero

Olá, tenho um arquivo de texto contendo as seguintes informações:

#[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

Quero pegar a --Endlinha a Returnlinha e a Elapsedlinha se o retorno correspondente for >0.

Até agora, consegui executar o grep na linha Returngrep "#RETURN:" -A 1 -B 1 f.log

Mas como fazer o grep apenas se o Return for >0 ?

Saída desejada:

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

Responder1

Com 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}: Se a linha terminar com END, salve-a como variável preve vá para a próxima linha; Esta é a linha antesRETURN

  • /^#RETURN/ && $2>0 {cur=$0; pr=1; next}: Se a linha começar com #RETURNe o segundo campo for maior que 0, salve a linha como cur, defina a variável prcomo 1 (verdadeiro) e vá para a próxima linha

  • pr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}: Se prfor verdadeiro, imprima a saída no formato desejado e, finalmente, defina prcomo 0 (falso)

Exemplo:

% 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

Responder2

você pode tentar isso;

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

Por exemplo;

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

Responder3

Você deve usar expressões regulares em grep:

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

Essa regexp deve capturar qualquer número (positivo) que não seja um único 0 (ou não comece com 0).

informação relacionada