Como posso manter os códigos de cores com a entrada grep?

15

Se eu usar dois grepcomandos consecutivos , por exemplo:

echo "foo bar" | grep foo | grep bar

Então o primeiro padrão ("foo") não é realçado. De fato, parece que o grep remove os códigos de cores de sua entrada. Existe alguma maneira de evitar isso?

Chris2048
fonte
Outra pergunta com a mesma resposta: como você pode restaurar a saída colorida para um grep dentro de uma função bash?
Camille Goudeseune

Respostas:

23

Use --color=always.

grepdetecta se a saída é para um tubo (ou arquivo). Você quase nunca deseja cores quando a saída é arquivar - pois são seqüências de escape para o terminal. Tipicamente:

foo ^[[01;31m^[[Kbar^[[m^[[K

por exemplo:

grep pattern file > result

Para substituir o uso --color=always.

grep --color=always pattern file | ...

Exemplo:

Tendo arquivo:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

Então

grep --color=always ID file | grep --color=always 2013 | grep foo

iria colorir ID, 2013e foo.

grep --color=always ID file | grep 2013 | grep foo

iria colorir IDe foo, mas não 2013.

1 Importante: Você também deve se lembrar que a desordem adicionadadas cores é passada para o próximo comando da cadeia. Depois que o ID é colorido, você não pode (com facilidade), corresponder, por exemploID=111.


Em alguma ocasião, talvez alguém queira cores terminais em arquivo . Tente por exemplo

 grep --color=always foo file > result
 cat result

Embora o arquivo resultante tenha portabilidade muito limitada.


A coloração em si também é uma extensão.


Conforme mencionado pelo bom @slm , você pode adicionar:

export GREP_OPTIONS="--color=always"

para o seu .bashrcetc, mas não, a menos que você, por algum motivo, realmente entenda as implicações e ainda queira fazê-lo. Em muitos aspectos, isso se romperia grepdevido ao fato mencionado acima 1 .

Adicione um aliasse você o usa com frequência.

 alias cgrep='grep --color=always'

GREP_OPTIONSe --color ter três opções : never, autoe always. Os dois primeiros devem ser os únicos considerados GREP_OPTIONS.

Você também pode conferir GREP_COLORSnas manpáginas ou no gnu grep .

Runium
fonte
Detalhes adicionais sobre esses métodos prós / contras aqui: stackoverflow.com/questions/867877/…
slm
1
adicione isso à resposta também: export GREP_OPTIONS="--color=always"em um .bashrc torna as opções os padrões para qualquer greps, e você o acertou em cheio!
slm
Good stuff neste Super Uuser Q & A: superuser.com/questions/36022/...
SLM
"grep detecta se a saída é para um tubo" - aha! Essa é a chave, o grep não está colorindo se faz parte de um cano. Deve haver um princípio de substituição contra esse tipo de coisa: - /
Chris2048 12/13/13
@ Chris2048: Isso é padrão para a maioria das ferramentas que imprimem cores no terminal. Você pode encontrar mais detalhes com isso , sobre como é detectado, e isso mostra alguns problemas, por exemplo, ls e cores nos OS nativos do OSX lse nos coreutils do gnu.
Runium