Gesamte Ausgabe anzeigen, aber Suchübereinstimmungen hervorheben

Gesamte Ausgabe anzeigen, aber Suchübereinstimmungen hervorheben

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 -Aund 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

-zFü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=autoin 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>'.

verwandte Informationen