Grep saída com várias colors?

Existe um método elegante no bash de executar o grep em um arquivo de texto com 2 ou mais padrões, e cada padrão correspondente é gerado em uma cor diferente?

Então, uma linha que combina com MALE e AUGUST colocaria MALE em azul e AUGUST em laranja? Estou aberto ao uso de sed , awk , grep e crayons ou outros …

Você pode fazer cascatas em greps com colors diferentes, especificando –color = sempre e usando a expressão regular ‘foo | $’ para passar todas as linhas.

Por exemplo:

 tail -f myfwlog | GREP_COLOR='01;36' egrep --color=always 'ssh|$' | GREP_COLOR='01;31' egrep -i --color=always 'drop|deny|$' 

Se você quiser que toda a linha seja destacada, atualize sua expressão regular de acordo:

 .... GREP_COLOR='01;31' egrep -i --color=always '^.*drop.*$|^.*deny.*$|$' 

grep é um correspondente de expressão regular, não um marcador de syntax :). Você terá que usar várias invocações do grep , usando um valor diferente de GREP_COLOR para cada um.

 GREP_COLOR="1;32" grep foo file.txt | GREP_COLOR="1;36" grep bar 

Isso destacaria “foo” e “bar” em colors diferentes em linhas que combinam com ambas. Eu não acho que existe uma maneira (simples) de lidar com todas as ocorrências de qualquer um dos padrões, além de mesclar o stream de saída de duas chamadas independentes:

 { GREP_COLOR="1;32" grep foo file.txt GREP_COLOR="1;36" grep bar file.txt } | ... 

que obviamente será diferente do que se houvesse uma maneira de atribuir uma cor separada a cada expressão regular.


Você pode usar o awk para replace cada partida por si mesmo, contida no código de controle correto.

  echo "foo bar" | awk '{ gsub("bar", "\033[1;33m&\033[0m"); gsub("foo", "\033[1;36m&\033[0m"); print }' 

Em cada linha, você substitui globalmente qualquer coisa que corresponda à expressão regular dada a si mesma ( & ) envolvida nas seqüências de escape ANSI pela cor desejada (o que grep --color faz para você). Depois de processar todas as correspondências possíveis, você precisa explicitamente imprimir a linha.

Se você quer algo fora da checkbox, provavelmente está procurando por um sinal de luz .

Aqui está um exemplo: Saída do JBoss

Dê uma olhada. É incrivelmente útil para colorir palavras em colors diferentes automaticamente. É um projeto impressionante que é construído sobre o ack .

Eu tive a necessidade de destacar strings em arquivos de texto, e não encontrei uma maneira que atendesse às minhas necessidades, então escrevi um programa C simples para colorir as strings correspondentes às expressões regulares.

Você pode baixar o código-fonte do GitHub:

 git clone http://github.com/mbornet-hl/hl 

então :

 cd hl/cr; make 

Aqui está o uso:

 hl: version 1.21 Usage: hl [-h|-eidD][-E][-rgybmcwRGYBMCW] regexp ... -h : help -v : version -u : do not bufferize output on stdout -e : extended regular expressions -i : ignore case -E : print on stderr -r : red -g : green -y : yellow -b : blue -m : magenta -c : cyan -w : white -R : red (reverse video) -G : green (reverse video) -Y : yellow (reverse video) -B : blue (reverse video) -M : magenta (reverse video) -C : cyan (reverse video) -W : white (reverse video) -d : debug -D : display regular expressions 

Para colorir a palavra “vermelho” em vermelho e a palavra “azul” em azul, basta digitar o seguinte comando:

 echo "red blue red blue" | hl -r red -b blue 

e aqui está um exemplo para destacar a saída do comando ifconfig:

 hl -ei -m '^(eth|(vir)?br|vnet)[0-9.]*:[0-9]+\>' \ -b '^(eth|(vir)?br|vnet)[0-9.]*\.[0-9]+\>' \ -c '([0-9a-f]{2}:){5}[0-9a-f]{2}' \ -g '\|\|([0-9]{1,3}\.){3}[0-9]{1,3}\>' \ -y '^(eth|(vir)?br|vnet)[0-9.:]*\>' \ -W '[0-9a-f]{4}::[0-9a-f]{4}\:[0-9a-f]{4}:[0-9a-f]{4}:[0-9a-f]{4}' \ -r ' (errors|dropped|overruns):[^0][0-9]*' 

A ordem em que você especifica as colors é importante: se uma string corresponder a várias expressões regulares, a primeira como uma prioridade mais alta que a segunda, a segunda como uma prioridade mais alta que a terceira, e assim por diante …

Espero que isto ajude.

Experimente o maravilhoso rpen http://github.com/rtulke/rpen

requer egrep ou grep

cp rpen.py /usr/local/bin/rpen chmod 777 / usr / local / bin / rpen

Então tente

ps xau | rpen Ss “S +” “\? \?”

Então aqui está a (s) versão (ões) usando sed. Digamos que você queira que a palavra “FAILED” seja colorida de vermelho, isso seria:

 sed 's/\(ERROR\)/\o033[31m\1\o033[39m/' 

Para que a linha inteira contendo a palavra “FAILED” esteja marcada em vermelho:

 sed 's/\(.*ERROR.*\)/\o033[31m\1\o033[39m/' 

Para que várias palavras marcadas sejam vermelhas:

 sed 's/\(ERROR\|FAILED\)/\o033[31m\1\o033[39m/' 

Para ter várias palavras e suas linhas marcadas em vermelho:

 sed 's/\(.*FAILED.*\|.*ERROR.*\)/\o033[31m\1\o033[39m/' 

Para ter várias colors (ERROR = vermelho / FAILED = azul)

 sed -e 's/\(ERROR\)/\o033[31m\1\o033[39m/' -e 's/\(FAILED\)/\o033[34m\1\o033[39m/' 

Para usar tudo isso em ssh:

 ssh user@host -t "tail -n 1024 -f /some/log/file | sed --unbuffered -e 's/\(.*ERROR.*\|.*FAILED.*\)/\o033[31m\1\o033[39m/' -e 's/\(.*postfix.*\|.*dhcpd.*\)/\o033[32m\1\o033[39m/'" 

E por não ter que digitar isso toda vez, apenas declare isso como uma function em seu bashrc.

Para outras colors, procure códigos ANSI.

Que tal agora? Você pode fazê-lo com o grep SOMENTE! Truques aqui são (1) você toma / OU / das palavras que você está procurando; (2) você usa as opções -A e -B com números suficientemente grandes (maiores que a contagem de linhas do seu arquivo).

 echo "you make it" > tmp echo "you take it" >> tmp echo "you cake it" >> tmp echo "you bake it" >> tmp echo "you wake it" >> tmp GREP_COLOR='1;32' grep -P "(take|cake|bake)" --color=always tmp | GREP_COLOR='1;33' grep -P "(cake|bake)" --color=always -A10000 -B10000 | GREP_COLOR='1;34' grep -P "(bake)" --color=always -A10000 -B10000 

O cxpgrep é certo para esse propósito – destacar padrões em colors diferentes.

 cxpgrep 'PAT1|PAT2|...' FILE_OR_DIRECTORY 

Minha resposta está abaixo:

 tailf logfile awk '/MALE/' {print "\033[34m" $0 "\033[39m"} '/MALE/' {print "\033[33m" $0 "\033[39m"}