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?


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.


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.