Wie kann ich Farbcodes mit Grep-Eingabe beibehalten?

15

Wenn ich zwei aufeinanderfolgende grepBefehle verwende, zB:

echo "foo bar" | grep foo | grep bar

Dann wird das erste Muster ("foo") nicht hervorgehoben. Tatsächlich scheint grep Farbcodes aus seiner Eingabe zu entfernen. Gibt es eine Möglichkeit, dies zu verhindern?

Chris2048
quelle
Eine andere Frage mit der gleichen Antwort: Wie kann man eine farbige Ausgabe in einem Grep innerhalb einer Bash-Funktion wiederherstellen?
Camille Goudeseune

Antworten:

22

Verwenden Sie --color=always.

grepErkennt, ob die Ausgabe in eine Pipe (oder Datei) erfolgt. Sie möchten meistens keine Farben, wenn die Ausgabe in einer Datei erfolgen soll - das sind Escape-Sequenzen für das Terminal. Normalerweise:

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

von zB:

grep pattern file > result

Zum Überschreiben verwenden --color=always.

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

Beispiel:

Datei haben:

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

Dann

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

würde färben ID, 2013und foo.

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

würde färben IDund foo, aber nicht 2013.

1 Wichtig: Sie müssen auch bedenken, dass die hinzugefügte Unordnung von Farben an den nächsten Befehl in der Kette übergeben wird. Sobald der Ausweis gefärbt ist, können Sie ihn (mit Leichtigkeit) nicht mehr zuordnen, zID=111.


Manchmal möchte man vielleicht Terminalfarben in einer Datei haben . Versuchen Sie zB

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

Die resultierende Datei wäre jedoch nur sehr eingeschränkt portabel.


Die Färbung selbst ist auch eine Erweiterung.


Wie von der guten @slm erwähnt , können Sie hinzufügen:

export GREP_OPTIONS="--color=always"

zu Ihrem .bashrcetc, aber nicht, wenn Sie aus irgendeinem Grund die Implikationen wirklich verstehen und es immer noch tun wollen. Es würde in vielerlei Hinsicht grepaufgrund der oben genannten Tatsache brechen 1 .

Fügen Sie ein hinzu, aliaswenn Sie es häufig verwenden.

 alias cgrep='grep --color=always'

GREP_OPTIONSund --color nehmen Sie drei Optionen : never, autound always. Die beiden ersten sollten die einzigen sein, die berücksichtigt werden GREP_OPTIONS.

Sie können auch auf GREP_COLORSden manSeiten oder bei gnu grep nachsehen .

Runium
quelle
Weitere Details zu diesen Methoden finden Sie hier: stackoverflow.com/questions/867877/…
slm
1
export GREP_OPTIONS="--color=always"Fügen Sie dies auch zur Antwort hinzu: In einer .bashrc-Datei werden die Optionen zu Standardeinstellungen für alle greps, und Sie haben es so ziemlich geschafft!
slm
Good stuff in diesem Super - Uuser Q & A: superuser.com/questions/36022/...
slm
"grep erkennt, ob die Ausgabe in eine Pipe erfolgt" - aha! Dies ist der Schlüssel, grep färbt nicht, wenn es Teil einer Pfeife ist. Es sollte ein Substitutionsprinzip gegen
solche
@ Chris2048: Dies ist Standard für die meisten Tools, die Farben auf das Terminal drucken. Möglicherweise finden Sie hierdurch weitere Details dazu , wie es erkannt wird . Dies zeigt einige Probleme, z. B. durch ls und Farben auf OSX-Native- lsund Gnu-Coreutils.
Runium