Marque as ocorrências da palavra-chave com uma cor diferente

12

Eu tenho um programa que gera uma saída para stdout como:

[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 mais fácil identificar as falhas da saída, gostaria de marcar as ocorrências da palavra-chave FAIL com vermelho sem descartando as outras mensagens. Seria bom se eu também pudesse destacar as palavras-chave OK com verde :).

Fazer um canal para egrep --color FAIL mostrará apenas as linhas em que a palavra-chave FAIL está presente.

    
por Theodor 01.11.2012 / 17:31

3 respostas

9

Com base no hack brilhante "% ou nada" do manatwork na outra pergunta, 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 grep na saída duas vezes, com uma variável de ambiente GREP_COLORS diferente a cada vez.

O valor "01; 32" significa "verde em negrito" e o outro significa "vermelho em negrito". Consulte o artigo da Wikipédia sobre os códigos ANSI para obter mais ideias.

Infelizmente, isso requer o GNU grep versão 2.5.3 ou superior. Versões mais antigas do GNU grep suportavam um mecanismo de coloração diferente, mas essas versões têm um bug que o impede de usar o recurso em um pipeline mais de uma vez. O BSD grep emula o antigo mecanismo de coloração do GNU grep, e ele funcionará duas vezes em um pipeline, mas ele grita sobre a "sub-expressão vazia" devido ao manatwork hack.

Você pode remover as barras invertidas no final das duas primeiras linhas para criar uma única linha. Eu acabei de dividi-lo aqui para clareza e para jogar bem com o formato de página SE.

    
por 01.11.2012 / 18:22
1

Você pode usar multitail ou ccze para isso, ambos permitem que configs descrevam regexps para combinar e cores.

    
por 01.11.2012 / 21:03
1

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

cat yourfile | himul '\[OK\]' '\[FAIL\]'
    
por 29.03.2013 / 21:57

Tags