Como faço para grep em um log ao vivo (stdout)?

0

Não sei se o que é stdout, mas é o que penso.

O que eu quero fazer é filtrar uma certa mensagem de log ao executar um executável.

Eu tentei isso:

Executable 2>&1 /dev/null | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"

E um normal:

Executable | grep -v "fixme:quartz:Parser_OutputPin_QueryInterface No interface for {56a868a5-0ad4-11ce-b03a-0020af0ba770}!"

Mas o Terminal ainda estava cheio de milhares de mensagens de fixme:quartz etc.

    
por DisplayName 21.01.2015 / 17:05

1 resposta

3

Primeiro, você precisa descobrir se as mensagens que você quer estão sendo enviadas para stdout ou stderr. No seu primeiro exemplo, você tem o stderr sendo redirecionado para stdout - essa é a parte "2 > & 1". Você também tem "/ dev / null" na linha de comando, o que não faz sentido. Por que "/ dev / null" aparece na linha de comando?

Em segundo lugar, você precisa decidir quais mensagens deseja ver. O sinalizador "-v" para grep irá inverter a correspondência - somente as linhas que não corresponderem à sua sequência padrão serão impressas. O padrão que você está especificando é bastante preciso: talvez seja necessário tentar um padrão menos específico, como 'fixme:quartz' , que, em virtude de seu comprimento mais curto, fará com que grep -v não corresponda a mais linhas.

Se eu fosse você, faria algo assim:

Executable > log 2> err

Isso separa stdout e stderr em dois arquivos diferentes. Se eu quisesse encontrar a string "fixme: quartz", eu faria:

grep 'fixme:quartz' log
grep 'fixme:quartz' err

para decidir em qual arquivo olhar e, em seguida, use um editor de texto que suporte expressões regulares (como vim ) para encontrar o que eu queria.

Se isso não funcionar, ou se Executable for executado por muito tempo e você quiser ver mensagens específicas, faça o procedimento acima e determine sua expressão regular usando vim e descubra se a mensagem estiver em stdout ou stderr. Então você pode fazer isso:

Executable > log 2> err
tail -f log | grep 'fixme:quartz'  # or whatever regular expression

Como Executable é executado e produz mensagens, tail -f os lerá periodicamente do arquivo "log" e imprimirá em seu próprio stdout, onde grep filtrará por você.

    
por 21.01.2015 / 17:15