Bewahren Sie die Farbe nach dem Paspeln von grep zu grep

140

Es gibt eine ähnliche Frage in Preserve ls Farbe nach dem Grep'ing, aber es ärgert mich, dass die Farbe nicht erhalten bleibt, wenn Sie farbige Grep-Ausgaben in ein anderes Grep leiten .

Als Beispiel grep --color WORD * | grep -v AVOIDwird die Farbe der ersten Ausgabe nicht beibehalten. Aber für mich ls | grep FILEbehalten Sie die Farbe, warum der Unterschied?

Zitrax
quelle
2
Diese Frage scheint nicht zum Thema zu gehören, da es sich um die Verwendung von Unix- Befehlen handelt. Sie
Raptor

Antworten:

162

grepDeaktiviert manchmal die Farbausgabe, z. B. beim Schreiben in eine Pipe. Sie können dieses Verhalten mit überschreibengrep --color=always

Die richtige Kommandozeile wäre

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

Dies ist ziemlich ausführlich, alternativ können Sie einfach die Zeile hinzufügen

alias cgrep="grep --color=always"

zu deinem .bashrczum Beispiel und cgrepals farbiges grep verwenden. Bei der Neudefinition grepkönnen Probleme mit Skripten auftreten, die auf einer bestimmten Ausgabe von grepASCII-Escape-Code beruhen und diesen nicht mögen.

Otto Allmendinger
quelle
4
Diese Lösung funktioniert nur unter bestimmten glücklichen Umständen. Siehe andersonvoms Antwort unten.
Studog
In meinem Fall (Ubuntu) hatte ich schon Alias ​​zu grep. alias grep='grep --color=autoIch muss also nur meine ~/.bashrcPosition ändern, wo sie ursprünglich definiert wurde.
sobi3ch
Funktioniert nicht für mich - ähnlich wie in diesem Szenario stackoverflow.com/a/7640077/248616
Nam G VU
Diese schöne kreative Idee ist einfach und funktioniert stackoverflow.com/a/36288791/248616
Nam G VU
Die Frage ist, wie man den zweiten Grep dazu bringt, die Farbe des ersten nicht zu unterdrücken. Dies ist keine Antwort darauf.
johannes_lalala
74

Ein Ratschlag:

Bei Verwendung grep --color=alwayswerden die tatsächlichen Zeichenfolgen, die an die nächste Pipe weitergegeben werden, geändert. Dies kann zu folgender Situation führen:

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

Obwohl die Option -ve '12'die mittlere Zeile ausschließen sollte, wird dies nicht der Fall sein, da zwischen 1und Farbzeichen stehen 2.

andersonvom
quelle
Wenn Sie verwenden --color=auto, sollte es die Tatsache aufgreifen, dass Sie es an eine andere Stelle leiten, und Farben insgesamt unterdrücken, aber es macht den Zweck irgendwie zunichte. Wenn Sie immer noch farbige Ergebnisse wünschen, können Sie diese bei der letzten Pipe erneut verwenden --color.
andersonvom
2
Zumindest unter Mac OS X funktioniert das Färben an der letzten Pipe, wie @andersonvom vorschlägt, nicht. Nicht sicher warum; Vielleicht färbt es das ausgeschlossene Muster? --color=alwaysfunktioniert, nehme ich an, mit den oben genannten Vorbehalten.
user766353
3
Sie müssen zweimal dasselbe Grep-Muster in Ihrem Ausdruck haben. Ich habe dies gerade auf einem Mac getestet: http://i.imgur.com/BhmwAlF.png
andersonvom
9

Wiederholen Sie einfach den gleichen grep-Befehl am Ende Ihrer Pipe.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD

Alex
quelle
2
Würde das Umkehren der Befehle nicht das gleiche Ergebnis liefern? grep -v AVOID * | grep WORD
Brydon Gibson
@ BrydonGibson wahrscheinlich, aber es war ein Beispiel, um zu zeigen, dass es für eine beliebige Anzahl von Pipe-Befehlen funktioniert
Alex