Como obter código de saída grep mas imprimir todas as linhas?

4

Gostaria de verificar se uma linha impressa por um comando contém uma mensagem de erro, mas gostaria de imprimir também toda a saída do comando (para make logs). Existe alguma maneira de obter all a saída de um comando (não modificado) e um código de saída baseado no conteúdo dessa saída? A solução mais próxima que eu conseguia pensar era my_command | grep -C 99999999 '^Error' .

Isso é semelhante, mas distinto para essa questão , já que eu me preocupo com o código de saída e não quero colorir.

    
por l0b0 30.09.2014 / 11:56

2 respostas

6

Use tee e redirecione para stderr

my_command | tee /dev/stderr | grep -q '^Error'

Ele salvará grep status de saída e duplicará toda a saída para stderr visível no console. Se você precisar dele no stdout, você pode redirecioná-lo mais tarde assim:

( my_command | tee /dev/stderr | grep -q '^Error' ) 2>&1

Observe que grep não produzirá nada, mas estará em tee .

    
por 30.09.2014 / 12:42
2

Você pode fazer isso com o AWK:

command 2>&1 | awk '/^Error/{exit_code=1;}/^/ END{ exit !exit_code}'

Isso imprimirá todas as linhas de saída e retornará 0 se encontrar Error e retornará 1 se não encontrar.

    
por 30.09.2014 / 12:37