Preservar a coloração após canalizar grep para grep

140

Há uma pergunta semelhante em Preserve ls colouring após grep'ing, mas me incomoda que, se você colocar a saída grep colorida em outro grep, a cor não será preservada.

Como exemplo grep --color WORD * | grep -v AVOID, não mantém a cor da primeira saída. Mas, para mim ls | grep FILE, mantenho a cor, por que a diferença?

Zitrax
fonte
2
Esta questão parece estar fora de tópico, pois é sobre o uso de comandos do Unix, pertence a unix.stackexchange.com
Raptor

Respostas:

162

grepÀs vezes, desativa a saída colorida, por exemplo, ao gravar em um tubo. Você pode substituir esse comportamento porgrep --color=always

A linha de comando correta seria

grep --color=always WORD * | grep -v AVOID

Isso é bem detalhado, ou você pode adicionar a linha

alias cgrep="grep --color=always"

à sua .bashrc, por exemplo, e uso cgrepcomo o grep colorido. Ao redefinir, grepvocê pode ter problemas com scripts que dependem de saída específica grepe não gostam de código de escape ascii.

Otto Allmendinger
fonte
4
Esta solução funciona apenas sob certas circunstâncias de sorte. Veja a resposta de andersonvom abaixo.
Studion
No meu caso (Ubuntu) eu já tinha o pseudônimo de grep. alias grep='grep --color=autoentão eu preciso alterar meu local ~/.bashrconde foi definido em primeiro lugar.
Sobi3ch
Não está funcionando para mim - semelhante a este cenário stackoverflow.com/a/7640077/248616
Nam G VU
Esta idéia criativa agradável é apenas simples e trabalhando stackoverflow.com/a/36288791/248616
Nam G VU
a questão é sobre como fazer o segundo grep não suprimir a cor do primeiro. Esta não é uma resposta para isso.
johannes_lalala
74

Uma palavra de conselho:

Ao usar grep --color=always, as cadeias reais sendo passadas para o próximo tubo serão alteradas. Isso pode levar à seguinte situação:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Mesmo que a opção -ve '12'deva excluir a linha do meio, não será porque existem caracteres coloridos entre 1e 2.

andersonvom
fonte
Se você usar --color=auto, deve entender o fato de que você o está direcionando para outro lugar e suprimir completamente as cores, mas isso derrota o objetivo. Se você ainda deseja resultados coloridos, acho que você pode cumprimentá-lo novamente no último tubo usando --color.
18715 Andersonvom
2
No Mac OS X, pelo menos, colorir no último tubo, como sugere a @andersonvom, não funciona. Não sei por que; talvez esteja colorindo o padrão excluído? --color=alwaysfunciona, com, eu assumo, as advertências mencionadas acima.
user766353
3
Você precisa ter o mesmo padrão grep duas vezes na sua expressão. Acabei de testar isso em um mac: http://i.imgur.com/BhmwAlF.png
andersonvom
9

Simplesmente repita o mesmo comando grep no final do seu pipe.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

Alex
fonte
2
A reversão dos comandos não forneceria o mesmo resultado? grep -v AVOID * | grep WORD
Brydon Gibson
@BrydonGibson provavelmente, mas foi um exemplo para mostrar que ele funciona para qualquer número de comandos canalizada
Alex