2010-02-24 15 views
103

Jest jedno pytanie simlar w Preserve ls colouring after grep’ing, ale denerwuje mnie to, że jeśli potrącić kolorowe grep wyjście do innego grepa, że ​​kolorowanie nie jest zachowane.Zachowaj kolorowanie po wypiciu grep do grep

Jako przykład grep --color WORD * | grep -v AVOID nie zachowuje koloru pierwszego wydruku. Ale dla mnie ls | grep FILE zachować kolor, dlaczego różnica?

+2

To pytanie wydaje się być nie na temat, ponieważ jest o wykorzystanie poleceń Unix, należący do http://unix.stackexchange.com – Raptor

Odpowiedz

116

grep czasami wyłącza wydruki kolorowe, na przykład podczas zapisu do potoku. Możesz zmienić to zachowanie z grep --color=always

Poprawny wiersz poleceń byłoby

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

Jest to dość rozwlekły, alternatywnie można po prostu dodać linię

alias cgrep="grep --color=always" 

do swojej .bashrc na przykład i użytkowania cgrep jako kolorowy grep. Podczas redefiniowania grep możesz napotkać problemy ze skryptami, które opierają się na konkretnym wyjściu grep i nie lubisz kodu ucieczki ascii.

+1

To rozwiązanie działa tylko w pewnych okolicznościach szczęśliwców. Zobacz odpowiedź andersonvoma poniżej. – studog

62

Mała rada:

Podczas korzystania grep --color=always rzeczywiste ciągi są przekazywane do następnej rury zostaną zmienione. Może to prowadzić do następującej sytuacji:

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

Chociaż opcja -ve '12' powinny wykluczać środkową linię, to nie dlatego, że są znaki koloru pomiędzy 1 i 2.

+0

nie ma obejścia dla grep, prawda? –

+0

Jeśli użyjesz '--color = auto', to powinieneś podnieść fakt, że robisz to gdzie indziej i całkowicie pomijasz kolory, ale to w pewnym sensie pokonuje cel. Jeśli nadal chcesz uzyskać kolorowe wyniki, prawdopodobnie możesz go ponownie odsłuchać w ostatniej rurze używając '--color'. – andersonvom

+1

W systemie Mac OS X co najmniej kolorowanie w ostatniej rurze, jak sugeruje @andersonvom, nie działa. Nie pewny dlaczego; może to koloruje wykluczony wzór? '--color = always' działa, z, jak zakładam, powyższymi zastrzeżeniami. – user766353

3

Chociaż nieco "hack-ish", działa również po prostu powtórzyć polecenie grep na końcu rury.
grep WORD * | grep -v AVOID | grep WORD