
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 --End
linha a Return
linha e a Elapsed
linha 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 comEND
, salve-a como variávelprev
e vá para a próxima linha; Esta é a linha antesRETURN
/^#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 comocur
, defina a variávelpr
como 1 (verdadeiro) e vá para a próxima linhapr {printf "%s\n%s\n%s\n", prev, cur, $0; pr=0}
: Sepr
for verdadeiro, imprima a saída no formato desejado e, finalmente, definapr
como 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).