Wenn Sie eine Pipe von grep bis less verwenden, erhalten Sie farbige Ergebnisse

246

Ich benutze oft die Option --colour von grep, aber ich benutze oft auch weniger. Wie kann ich grep Ergebnisse zu weniger leiten und trotzdem die Färbung erhalten. (Oder ist das möglich?)

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

EDIT :

Ich suche eine direkte Lösung oder etwas Ähnliches.

Jeremy Powell
quelle
mögliches Duplikat von Get colors in 'less' 'command
Ciro Santilli
Was macht *das? Aus der Manpage von grep: *: The preceding item will be matched zero or more times.Aber ich verstehe immer noch nicht ..! @JeremyPowell
Shayan

Antworten:

274

Wenn Sie es einfach ausführen grep --color, wird grep --color=autoerkannt, ob es sich bei der Ausgabe um ein Terminal handelt, und wenn ja, werden Farben aktiviert. Wenn jedoch eine Pfeife erkannt wird, wird die Färbung deaktiviert. Der folgende Befehl:

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

Aktiviert immer die Färbung und überschreibt die automatische Erkennung, und Sie erhalten die farbige Hervorhebung in less.

BEARBEITEN: Obwohl die Verwendung nur lessfür mich funktioniert, erfordern ältere Versionen möglicherweise, dass das -RFlag Farben verarbeitet, wie von dort vorgeschlagen.

drrlvn
quelle
143
Sie müssen verwenden less -Rfür die Farbcodierung von weniger korrekt interpretiert werden
therefromhere
1
Es hat bei mir einfach geklappt less, es kann versionsabhängig sein.
Drrlvn
1
Ein (hoffentlich) nützlicher Zusatz: Ich musste einige Streichhölzer ausschließen, aber die Farbgebung beibehalten, damit ich am Ende grep pattern file | grep -v badpattern | grep --colour=always pattern | less -Rgenau das bekam, was ich brauchte . (
Nochmals vielen
7
Ich kann nicht glauben, dass sie die Funktion zur Farbverarbeitung einfach implementiert haben lessund deshalb die Chance verpasst haben, ein spezielles colorlessWerkzeug zu haben . Nur für den Namen hätte es getan werden sollen! Ich sollte wahrscheinlich einen Patch schreiben, der -R automatisch aufruft, wenn die Binärdatei als ausgeführt wird colorless.
Christian
2
@OwenBlacker Möglicherweise handelt es sich nicht um einen Alias. Sie könnten mit $LESSeingestellt haben -R.
Greyfade
27

Sie können dies in Ihre .bashrcDatei einfügen:

export GREP_OPTIONS="--color=always"

oder erstelle einen Alias ​​wie diesen:

alias grepc="grep --color=always"

und Sie müssen die -ROption für verwenden less, wie von dort darauf hingewiesen

Dennis Williamson
quelle
29
Warnung !: GREP_OPTIONS = "- color = always" kann viele Skripte unterbrechen , die grep (oder (e | f) grep) verwenden.
Mctylr
4
Ja, besser als Alias ​​grep. Sie können immer rein bekommen grepmit GREP, oder die überschreiben --colorOption manuell.
Asmeurer
Das funktioniert bei mir nicht, Alias ​​funktioniert aber.
Saeedgnu
9

In diesem Fall ziehe ich es vor, kleine sh-Dateien zu erstellen und sie anzulegen /usr/local/bin.
Ich benutze grepin der Regel in der rekursiven Art und Weise auf pwd, so das ist mein persönliches Skript:

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

Und dann habe ich es einfach so kopiert /usr/local/bin/g(ja, ich benutze es oft)

Iazel
quelle
2
Warum nicht einfach Shell-Funktionen für solche Dinge verwenden? g() { grep --color=always -r "$@" . | less -R }funktioniert identisch und wird wahrscheinlich (geringfügig) eine bessere Leistung liefern.
00:00 am
1
@ 00dani ja, das ist auch eine gültige Alternative und manchmal benutze ich sie. Bitte beachten Sie, dass in diesem Fall die meiste Zeit für E / A aufgewendet wird und daher keine wahrnehmbare Leistungssteigerung zu verzeichnen ist. Die Funktion muss stattdessen explizit geladen werden
Iazel
1

Machen Sie keinen Alias ​​"grep", besser "less", der niemals von Muscheln verwendet wird. In Ihrem .bashrcgerade setzen: alias less="less -r".

not2qubit
quelle
3
Nicht ganz richtig. Man muss beide grep --color=always und verwenden less -R. Beachten Sie, dass grep nur weiß, dass es in einen anderen Prozess geleitet wird, und die --color=autoOption ausschließlich diese Informationen verwendet, um zu entscheiden, ob Farben ausgegeben werden oder nicht.
Brandizzi
3
Beachten Sie, dass diese lessOption -randers ist als -R. Ist wahrscheinlich -Rsicherer.
Craig McQueen
1
Warum also meine Lösung herabstimmen? Das OP fragt speziell lessmit dem Beispiel, das bereits die Option "--color" verwendet.
not2qubit
3
Ein Alias ​​ist hier wahrscheinlich unerwünscht. lessunterstützt eine $LESSUmgebungsvariable. Anstelle eines Alias export LESS='-R'könnte es also vorzuziehen sein.
greyfade
0

Ich muss rennen

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

mit dem Flag -r nach less , um dies auszuführen.

Pierre François
quelle
Was macht *das? Aus der Manpage von grep: *: The preceding item will be matched zero or more times.Aber ich verstehe immer noch nicht ..!
Shayan,