Zachowaj kolorystykę po ułożeniu rur od grep do grep

140

Jest podobne pytanie w Zachowaj kolorowanie ls po grep'owaniu, ale denerwuje mnie, że jeśli przełączysz wyjście kolorowego grepa do innego grepa, kolorystyka nie zostanie zachowana.

Jako przykład grep --color WORD * | grep -v AVOIDnie zachowuje koloru pierwszego wydruku. Ale dla mnie ls | grep FILEzachowuję kolor, skąd ta różnica?

Zitrax
źródło
2
To pytanie wydaje się być niezwiązane
Raptor

Odpowiedzi:

162

grepczasami wyłącza wyjście koloru, na przykład podczas pisania do potoku. Możesz zmienić to zachowanie za pomocągrep --color=always

Właściwa linia poleceń byłaby

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

Jest to dość rozwlekłe, ale możesz też po prostu dodać wiersz

alias cgrep="grep --color=always"

do twojego .bashrcna przykład i użyj cgrepjako kolorowego grepa. Podczas redefiniowania grepmożesz napotkać problemy ze skryptami, które polegają na określonym wyjściu grepi nie lubią kodu ucieczki ascii.

Otto Allmendinger
źródło
4
To rozwiązanie działa tylko w pewnych szczęśliwych okolicznościach. Zobacz odpowiedź andersonvom poniżej.
reproduktor
W moim przypadku (Ubuntu) miałem już alias do grep. alias grep='grep --color=autowięc muszę po prostu zmienić moje miejsce, w ~/.bashrcktórym zostało zdefiniowane w pierwszej kolejności.
sobi3ch
Nie działa dla mnie - podobny do tego scenariusza stackoverflow.com/a/7640077/248616
Nam G VU
Ten fajny, kreatywny pomysł jest po prostu prosty i działający stackoverflow.com/a/36288791/248616
Nam G VU
chodzi o to, jak sprawić, by drugi grep nie tłumił koloru pierwszego. To nie jest odpowiedź na to pytanie.
johannes_lalala
74

Mała rada:

Podczas używania grep --color=alwaysrzeczywiste ciągi przekazywane do następnego potoku zostaną zmienione. Może to prowadzić do następującej sytuacji:

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

Mimo że opcja ta -ve '12'powinna wykluczać środkową linię, tak się nie stanie, ponieważ między 1a znajdują się kolorowe znaki 2.

andersonvom
źródło
Jeśli używasz --color=auto, to powinno wychwycić fakt, że używasz go gdzie indziej i całkowicie stłumić kolory, ale w pewnym sensie pokonuje to cel. Jeśli nadal chcesz kolorowe wyniki, myślę, że możesz je ponownie grepować przy ostatnim użyciu rury --color.
andersonvom
2
Przynajmniej na Mac OS X nie działa kolorowanie ostatniego potoku, jak sugeruje @andersonvom. Nie pewny dlaczego; może to koloryzuje wykluczony wzór? --color=alwaysdziała z, jak zakładam, zastrzeżeniami przedstawionymi powyżej.
user766353
3
Musisz mieć dwa razy ten sam wzorzec grep w swoim wyrażeniu. Właśnie przetestowałem to na komputerze Mac: http://i.imgur.com/BhmwAlF.png
andersonvom
9

Po prostu powtórz to samo polecenie grep na końcu potoku.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

Alex
źródło
2
Czy odwrócenie poleceń nie przyniosłoby tego samego rezultatu? grep -v AVOID * | grep WORD
Brydon Gibson,
@BrydonGibson prawdopodobnie, ale był to przykład pokazujący, że działa dla dowolnej liczby poleceń potokowych
Alex