
Wenn ich in Bash einen Befehl ausführen und nur Ausgabezeilen anzeigen möchte, die einem bestimmten Muster entsprechen, kann ich ihn an weiterleiten grep
, wie
Datei Testdatei
hello
there
my
friends
Befehl
$ cat testfile | grep 'hello'
hello #this will be highlightd
Dadurch wird die Suchübereinstimmung hervorgehoben und die gesamte Zeile angezeigt, auf die sie fällt. Ich kann -A
und verwenden -B
, um Zeilen vor und nach dieser Zeile anzuzeigen. Meine Frage ist, ob es möglich ist, den Befehl auszuführen und die gesamte Ausgabe wie gewohnt anzuzeigen, aber die Suchübereinstimmungen wie bei grep hervorzuheben? Meine Ausgabe wäre also
hello #highlighted
there
my
friends
Antwort1
So verwenden Sie ein Color GREP, um nur übereinstimmende Muster hervorzuheben, die Ausgabe aber ansonsten nicht zu ändern:
grep --color=always -e "^" -e "hello" testfile
Das erste Muster führt zu einer Übereinstimmung mit allen Zeilen (alle Zeilen werden gedruckt), das zweite Muster (und alle folgenden Muster) bewirkt, dass der übereinstimmende Text farblich hervorgehoben wird.
Da das erste Muster mit allen Zeilen übereinstimmt, jedoch nicht mit einem druckbaren Zeichen, fügt es keine farbliche Hervorhebung hinzu, sodass es nicht mit der Lesbarkeit des hervorgehobenen Textes konkurriert bzw. diese beeinträchtigt.
Antwort2
-z
Fügen Sie Ihrem GNU-Grep-Befehl eine Option hinzu :
cat testfile | grep --color=always -z 'hello'
oder kürzer
grep --color=always -z 'hello' testfile
Antwort3
Dies funktioniert sowohl mit GNU grep als auch mit grep unter FreeBSD:
grep --color=always 'hello\|$'
Es entspricht dem Text „hallo“ oder ( \|
) der nicht druckbaren Nullzeichenfolge am Ende jeder Zeile ( $
). Deshalb wird jede Zeile gedruckt, aber nur „hallo“ wird hervorgehoben.
Wahrscheinlich haben Sie dies bereits --color=auto
in Ihrer Shell konfiguriert. Dann müssen Sie höchstwahrscheinlich nichts angeben --color=always
:
grep 'hello\|$'
Sie können auch eine einfachere Version verwenden egrep
(mit erweiterten regulären Ausdrücken), wobei |
der „oder“-Ausdruck nicht maskiert werden muss:
egrep 'hello|$'
Siehe auch eine ähnliche Frage auf StackOverflow:Farbiges Grep – Anzeigen der gesamten Datei mit hervorgehobenen Übereinstimmungen
Antwort4
Hier ist eine Lösung mit ripgrep
, einem modernen, einfacher zu verwendenden (meiner Meinung nach) und viel schnelleren Ersatz für grep
:
cat my-file | rg --passthru '<REGEX>'
Auch die „Textmarkerfarbe“ kannst Du ganz einfach individuell anpassen:
# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'
Sehen man rg
(online Version).
Für den alltäglichen Gebrauch habe ich einen Shell-Alias erstellt:
# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'
Jetzt ist es so einfach wie cat my-file | hl '<REGEX>'
.