Uzyskiwanie kolorowych wyników podczas korzystania z rury od grep do mniej

246

Często używam opcji --colour grep, ale często też używam mniej. Jak mogę obniżyć wyniki grep do mniej i nadal zachować kolorystykę. (Czy to możliwe?)

grep "search-string" -R * --colour | less 

EDYCJA :

Szukam bezpośredniego rozwiązania lub czegoś równoważnego z tym.

Jeremy Powell
źródło
możliwy duplikat polecenia Uzyskaj kolory w „mniej”
Ciro Santilli 19 改造 中心 法轮功 六四 事件
Co ma *zrobić? Ze strony man grep: *: The preceding item will be matched zero or more times.Ale wciąż nie rozumiem ...! @JeremyPowell
Shayan

Odpowiedzi:

274

Po prostu uruchamia grep --colorto, grep --color=autoco wykrywa, czy wyjście jest terminalem, a jeśli tak, włącza kolory. Jednak po wykryciu rury wyłącza kolorowanie. Następujące polecenie:

grep --color=always -R "search string" * | less

Zawsze włącza kolorowanie i zastępuje automatyczne wykrywanie, a otrzymasz podświetlanie kolorów less.

EDYCJA: Chociaż używanie tylko lessdziała dla mnie, być może starsza wersja wymaga -Rflagi do obsługi kolorów, jak to sugeruje.

drrlvn
źródło
143
Trzeba użyć less -Rdo kodowania kolor powinien być interpretowany przez mniej poprawnie
therefromhere
1
Działa dla mnie z less, może być zależne od wersji.
drrlvn
1
Przydatny dodatek (mam nadzieję): musiałem wykluczyć niektóre mecze, ale zachować kolorystykę, więc właściwie skończyłem grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, co idealnie spełniło moje potrzeby. (Jeszcze raz dziękuję!)
Owen Blacker
7
Nie mogę uwierzyć, że właśnie wdrożyli funkcję obsługi kolorów lessi dlatego stracili szansę posiadania specjalnego colorlessnarzędzia. Sama nazwa powinna była zostać wykonana! Prawdopodobnie powinienem napisać łatkę, która wywołuje -R automatycznie, gdy plik binarny jest uruchamiany jako colorless.
Christian
2
@OwenBlacker To może nie być alias. Mogłeś $LESSustawić z -R.
greyfade
27

Możesz umieścić to w swoim .bashrcpliku:

export GREP_OPTIONS="--color=always"

lub utwórz taki alias:

alias grepc="grep --color=always"

i będziesz musiał użyć -Ropcji less, jak wskazano w tym miejscu

Dennis Williamson
źródło
29
Ostrzeżenie !: GREP_OPTIONS = "- color = always" może uszkodzić wiele skryptów używających grep (lub (e | f) grep).
mctylr
4
Tak, lepiej po prostu alias grep. Zawsze możesz uzyskać czystość za greppomocą GREPlub zastąpić --coloropcję ręcznie.
asmeurer,
To nie działa dla mnie, ale alias działa.
saeedgnu
9

W takim przypadku wolę tworzyć małe pliki sh i je włączać /usr/local/bin.
Zwykle używam grepw sposób rekurencyjny pwd, więc taki jest mój osobisty skrypt:

#!/bin/sh
grep --color=always -r "$@" . | less -R

A potem właśnie go skopiowałem jako /usr/local/bin/g(tak, często go używam)

Iazel
źródło
2
Dlaczego po prostu nie używać funkcji powłoki do tego rodzaju rzeczy? g() { grep --color=always -r "$@" . | less -R }działa identycznie i prawdopodobnie da (nieznacznie) lepszą wydajność.
00dani
1
@ 00dani tak, to też jest ważna alternatywa i czasami jej używam. Zauważ, że w tym przypadku większość czasu spędza się w IO, dlatego nie ma zauważalnego wzrostu wydajności :) Kolejną różnicą jest to, że raz w twojej ŚCIEŻCE, ten skrypt może być używany z innymi skryptami powłoki i aliasami; zamiast tego funkcja musi zostać jawnie załadowana
Iazel
1

Nie aliasuj „grep”, lepiej alias „less”, który nigdy nie jest używany przez powłoki. W twojej .bashrcprostu umieścić: alias less="less -r".

not2qubit
źródło
3
Nie do końca. Trzeba użyć obu grep --color=always i less -R. Zauważ, że grep tylko wie, że jest on przesyłany do jakiegoś innego procesu, a --color=autoopcja używa wyłącznie tych informacji, aby zdecydować, czy wydrukować kolory, czy nie.
brandizzi 17.04.13
3
Pamiętaj, że lessopcja -rjest inna niż -R. Prawdopodobnie -Rjest bezpieczniejszy.
Craig McQueen
1
Po co więc głosować w dół na moje rozwiązanie. OP dokładnie pyta lesso to w przykładzie, który już używa opcji `--color '.
not2qubit
3
Alias ​​jest prawdopodobnie tutaj niepożądany. lessobsługuje $LESSzmienną środowiskową. Dlatego zamiast aliasu export LESS='-R'może być preferowane.
greyfade
0

Musze biec

grep --color=always -R "search string" * | less - r

z flagą -r po mniej , aby to uruchomić.

Pierre François
źródło
Co ma *zrobić? Ze strony man grep: *: The preceding item will be matched zero or more times.Ale wciąż nie rozumiem ...!
Shayan