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

3

Olá, eu 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

Eu quero obter a linha --End a linha Return e a linha Elapsed se o retorno correspondente for > 0.

Até agora eu consegui usar a linha de retorno grep "#RETURN:" -A 1 -B 1 f.log

Mas como eu só grep se o retorno é > 0?

Saída desejada:

#[Tue Oct 25 00:00:57 2016] --- END
#RETURN: 1
#ELAPSED TIME (in seconds): 55
    
por Kheshav Sewnundun 25.10.2016 / 09:41

3 respostas

5

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 prev e vá para a próxima linha; Esta é a linha antes de RETURN

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

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

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
    
por 25.10.2016 / 09:57
0

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
    
por 25.10.2016 / 09:57
0

Você deve usar expressões regulares no seu grep :

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

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

    
por 25.10.2016 / 09:59