Saída de cauda para colorir com perl

3
tail -f logfile.log | perl -pe 's/.*foo*/\e[1;41m$&\e[0m/g'    

irá colorir todas as linhas contendo o padrão "foo" no arquivo logfile.log.

Como posso fazer uso disso para destacar não toda a linha, mas apenas o padrão exato?

echo "WARN ERROR foo"|sed 's#WARN#\x1b[33m&#; s#ERROR#\x1b[31m&#; s#foo#\x1b[32m&#'    

Quero dizer, se eu quiser fazer algo assim, como posso gerenciar?

    
por ybaylav 25.11.2014 / 14:07

2 respostas

1

Em primeiro lugar, você pode usar quase exatamente a mesma expressão regular e sintaxe que usou com sed . Basta alterar & para $& para Perl:

echo "WARN ERROR foo" | 
    perl -pe 's#WARN#\x1b[33m$&#; s#ERROR#\x1b[31m$&#; s#foo#\x1b[32m$&#'    

Ou, usando sua abordagem original do Perl, basta remover o .* de cada lado do padrão que você deseja corresponder:

tail -f logfile.log | perl -pe 's/foo/\e[1;41m$&\e[0m/g'    

Para uma abordagem mais versátil, você pode usar o pequeno script que eu postei em minha resposta aqui . Com ele, você pode colorir até 10 padrões com uma cor diferente para cada um. Por exemplo, para colorir as palavras ERROR , WARNING e foo , em uma cor diferente, insensível a maiúsculas e minúsculas:

tail -f logfile.log | color.pl -il "error,warning,foo"
    
por 26.11.2014 / 02:10
1

Veja um exemplo que destaca de ERROR para o final da linha, a linha inteira contendo WARN e foo , mas nada em torno dela. Apenas a primeira regra de correspondência é aplicada (por exemplo, WARN: ERROR foo conjuntos ERROR foo em vermelho), ajuste como achar melhor.

perl -pe 's/ERROR.*/\e[31m$&\e[0m/ || s/.*WARN.*/\e[33m$&\e[0m/ || s/foo/\e[32m$&\e[0m'

Uma abordagem alternativa para destacar palavras-chave é chamar uma função para determinar a cor da palavra-chave. (Este exemplo não faz a mesma coisa que o anterior: ele sempre destaca toda a linha.)

perl -pe '
    sub color {
         my ($keyword) = @_;
         $keyword =~ /err/i ? 31 :
         $keyword =~ /warn/i ? 33 :
         32;
    }
    if (/(ERROR|WARN|foo)/) {$color=color($1); s/^/\e[${color}m/; s/$/\e[0m/}
'
    
por 26.11.2014 / 01:48