Jak mogę zachować kody kolorów przy pomocy grep?


15

Jeśli użyję dwóch kolejnych greppoleceń, np .:

echo "foo bar" | grep foo | grep bar

Wtedy pierwszy wzór („foo”) nie jest podświetlony. W rzeczywistości wydaje się, że grep usuwa kody kolorów z jego danych wejściowych. Czy można temu zapobiec?


Kolejne pytanie z tą samą odpowiedzią: jak przywrócić kolorowe wyjście grepowi w funkcji bash?
Camille Goudeseune,

Odpowiedzi:


23

Zastosowanie --color=always.

grepwykrywa, czy dane wyjściowe są przesyłane do potoku (lub pliku). Większość nigdy nie chce kolorów, gdy dane wyjściowe są zapisywane - ponieważ są to sekwencje specjalne dla terminala. Zazwyczaj:

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

z np .:

grep pattern file > result

Aby zastąpić użycie --color=always.

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

Przykład:

Mając plik:

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

Następnie

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

by pokolorować ID, 2013a foo.

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

pokolorować IDi foo, ale nie 2013.

1 Ważne: Musisz także pamiętać, że dodany bałagan z kolorów jest przekazywany do następnego polecenia w łańcuchu. Po pokolorowaniu identyfikatora nie można (z łatwością) dopasować npID=111.


Przy niektórych okazjach może być potrzebne kolory terminala w pliku . Spróbuj np

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

Chociaż wynikowy plik miałby bardzo ograniczoną przenośność.


Samo zabarwienie jest również przedłużeniem.


Jak wspomniano w good @slm , możesz dodać:

export GREP_OPTIONS="--color=always"

do twojego .bashrcitp., ale nie, chyba że z jakiegoś powodu naprawdę rozumiesz implikacje i nadal chcesz to zrobić. Pod wieloma względami pękłby z greppowodu wspomnianego wyżej faktu 1 .

Dodaj, aliasjeśli często go używasz.

 alias cgrep='grep --color=always'

GREP_OPTIONSi --color wziąć trzy opcje : never, autoi always. Dwa pierwsze powinny być jedynymi rozważanymi GREP_OPTIONS.

Możesz także sprawdzić GREP_COLORSna manstronach lub w gnu grep .


Dodatkowe szczegóły na temat tych metod zalety / wady tutaj: stackoverflow.com/questions/867877/...
slm

1
dodaj to również do odpowiedzi: export GREP_OPTIONS="--color=always"w .bashrc ustawia domyślne opcje dla dowolnych greps, a ty prawie to przybiłeś!
slm

Dobre rzeczy w tym Super Uuser Pytania i odpowiedzi: superuser.com/questions/36022/…
slm

„grep wykrywa, czy wyjście jest przesyłane do potoku” - aha! To jest klucz, grep nie koloryzuje, jeśli jest częścią fajki. Powinna istnieć zasada substytucji wobec tego rodzaju rzeczy: - /
Chris2048

@ Chris2048: Jest to standard dla większości narzędzi drukujących kolory na terminalu. Możesz znaleźć więcej szczegółów na temat tego , w jaki sposób jest wykrywany, a to pokazuje pewne problemy, np. Ls i kolory na OSX native lsi GNU Coreutils.
Runium
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.