Marcar ocorrências da palavra-chave com uma cor diferente


13

Eu tenho um programa que cospe uma saída para stdoutgostar:

[OK]      Something is ok
[OK]      Something else is also ok
[FAIL]    This does not look good
[FAIL]    Neither does this
[OK]      At least this is fine

Para identificar mais facilmente as falhas da saída, gostaria de marcar as ocorrências da palavra FAIL- chave com vermelho, sem descartar as outras mensagens. Seria bom se eu também pudesse destacar as OKpalavras-chave com verde :).

Fazer um pipe para egrep --color FAILmostrará apenas as linhas em que a FAILpalavra-chave está presente.


1
Para uma grepsolução ver unix.stackexchange.com/a/34322
manatwork

você tem acesso para alterar o código fonte? é um script bash?
H3rrmiller

@manatwork A partir do link que especificou eu cliquei o meu caminho para stackoverflow.com/questions/972370 e com alguma tail -fe awkmagia, eu sou bom para ir =)
Theodor

Respostas:


10

Baseado no manatworkpequeno e brilhante truque "ou nada" da outra questão, ofereço isso, que adiciona a capacidade de obter duas cores de destaque:

 $ myprogram | \
   GREP_COLORS='mt=01;32' egrep --color=always '\[OK\]|' | \
   GREP_COLORS='mt=01;31' egrep --color=always '\[FAIL\]|'

Ou seja, você executa grepa saída duas vezes, com uma GREP_COLORSvariável de ambiente diferente a cada vez.

O valor '01; 32 'significa "verde negrito" e o outro significa "vermelho negrito". Veja o artigo da Wikipedia sobre códigos ANSI para mais idéias.

Infelizmente, isso requer GNU grep versão 2.5.3 ou superior. As versões anteriores do GNU grep suportavam um mecanismo de coloração diferente, mas essas versões possuem um bug que impede que você use o recurso em um pipeline mais de uma vez. O BSD grep emula o antigo mecanismo de coloração GNU grep e funcionará duas vezes em um pipeline, mas grita sobre "subexpressão vazia" devido ao manatworkhack.

Você pode remover as barras invertidas no final das duas primeiras linhas para transformar tudo em uma única linha. Acabei de dividi-lo aqui para maior clareza e para ser agradável com o formato de página SE.


Isso é realmente brilhante! Mas, por alguma razão, o script não parece destacar a segunda declaração na minha máquina. Estou executando o CentOS 5.
Theodor

2
O que está acontecendo aqui é que o CentOS 5 envia um greu GNU com idade suficiente para não suportar GREP_COLORS, no plural. Ele usa GREP_COLORapenas o método mais antigo , e esse método possui um bug que o impede de fazer a coisa certa. Se você alterar o comando a ser usado GREP_COLOR=32, isso mudará a cor de destaque apenas da primeira correspondência. Se você canalizar o resultado, hexdump -cpoderá ver que a adição do segundo egrepcomando faz alguma coisa, mas não é ANSI legal. Conclusão: você precisa atualizar greppara que isso funcione corretamente.
Warren Young

Haha, esse é um comentário tão perspicaz. Sim, o CentOS5 está envelhecendo, como em muitos sistemas operacionais: rodando em máquinas antigas emitindo mensagens de log antigas e abandonadas por Deus :) Vou tentar ver se uma atualização para o centos6 não é possível.
Theodor

Eu verifiquei apenas a minha solução em uma 6 caixa de CentOS, e ele faz o trabalho lá, confirmando o meu diagnóstico. (Os testes anteriores foram realizados em servidores Ubuntu.) O EL6 é fornecido com o GNU grep 2.6.3. Curiosamente, eles também corrigiram o GREP_COLORbug (singular), mesmo que o recurso tenha sido descontinuado assim que substituído.
Warren Young

Eu não consigo entender como isso resolve o problema desde a 1ª grep irá filtrar todos os "FAIL" então não haverá nada para o segundo grep para jogo ..
Laertis

1

Você pode usar multitail ou ccze para isso, ambos permitem que as configurações descrevam regexps para combinar e cores.


1

Com base na resposta de Warren Young, escrevi esse script Python que faz a mesma coisa de maneira mais elegante e com muito menos digitação. Então é assim que você usaria esse script:

cat yourfile | himul '\[OK\]' '\[FAIL\]'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.