it-swarm.com.de

Markieren Sie Text, der grep ähnelt, filtern Sie jedoch keinen Text heraus

Wenn Sie grep verwenden, wird jeder Text in einer Zeile hervorgehoben, der mit Ihrem regulären Ausdruck übereinstimmt.

Was ist, wenn ich dieses Verhalten möchte, aber grep auch alle Zeilen ausdrucken soll? Ich kam leer nach einem kurzen Blick durch die grep-Manpage.

239
Martin Konecny

Benutze ack. Kasse sein --passthru Option hier: ack . Es bietet den zusätzlichen Vorteil, dass reguläre Perl-Ausdrücke vollständig zugelassen werden.

$ ack --passthru 'pattern1' file_name

$ command_here | ack --passthru 'pattern1'

Du kannst es auch mit grep wie folgt machen:

$ grep --color -E '^|pattern1|pattern2' file_name

$ command_here | grep --color -E '^|pattern1|pattern2'

Dadurch werden alle Linien abgeglichen und die Muster hervorgehoben. Das ^ stimmt mit jedem Zeilenanfang überein, wird jedoch nicht gedruckt/hervorgehoben, da es sich nicht um ein Zeichen handelt.

(Beachten Sie, dass die meisten Setups standardmäßig --color verwenden. Möglicherweise benötigen Sie dieses Flag nicht.).

241
holygeek

Sie können sicherstellen, dass alle Zeilen übereinstimmen, bei irrelevanten Übereinstimmungen ist jedoch nichts hervorzuheben

egrep --color 'Apple|' test.txt 

Anmerkungen:

  • egrep kann auch geschrieben werden grep -E
  • --color ist normalerweise in den meisten Distributionen Standard
  • einige grep-Varianten "optimieren" die leere Übereinstimmung, daher möchten Sie möglicherweise stattdessen "Apple | $" verwenden (siehe: https://stackoverflow.com/a/13979036/939457 )
89
Sorin

EDIT:

Dies funktioniert mit OS X Mountain Lion's grep:

grep --color -E 'pattern1|pattern2|$'

Dies ist besser als '^|pattern1|pattern2', Da der Teil ^ Der Abwechslung am Zeilenanfang und der Teil $ Am Zeilenende übereinstimmt. Einige reguläre Ausdrücke heben pattern1 Oder pattern2 Nicht hervor, da ^ Bereits übereinstimmt und die Engine eifrig =.

Ähnliches gilt für 'pattern1|pattern2|', Da die Regex-Engine feststellt, dass die leere Abwechslung am Ende der Musterzeichenfolge mit dem Anfang der Betreffzeichenfolge übereinstimmt.

[1]: http://www.regular-expressions.info/engine.html

ERSTE BEARBEITUNG:

Am Ende habe ich Perl verwendet:

Perl -pe 's:pattern:\033[31;1m$&\033[30;0m:g'

Dies setzt voraus, dass Sie ein ANSI-kompatibles Terminal haben.

URSPRÜNGLICHE ANTWORT:

Wenn Sie mit einem seltsamen grep feststecken, könnte dies funktionieren:

grep -E --color=always -A500 -B500 'pattern1|pattern2' | grep -v '^--'

Passen Sie die Zahlen an, um alle gewünschten Zeilen zu erhalten.

Mit dem zweiten grep werden nur überflüssige -- - Zeilen entfernt, die vom BSD-Stil grep unter Mac OS X Mountain Lion eingefügt wurden, selbst wenn sich der Kontext aufeinanderfolgender Übereinstimmungen überschneidet.

Ich dachte, GNU grep hat die Zeilen -- Weggelassen, wenn sich der Kontext überschneidet, aber es ist eine Weile her, also erinnere ich mich vielleicht, dass ich falsch lag.

32
willkil

Sie können mein Hervorhebungsskript unter https://github.com/kepkin/dev-Shell-essentials verwenden

Es ist besser als grep, weil Sie jedes Match mit seiner eigenen Farbe hervorheben können .

$ command_here | highlight green "input" | highlight red "output"

enter image description here

27
kepkin

Da Übereinstimmungen hervorgehoben werden sollen, ist dies wahrscheinlich für den menschlichen Verzehr bestimmt (im Gegensatz zum Weiterleiten an ein anderes Programm). Daher wäre es eine gute Lösung, Folgendes zu verwenden:

less -p <your-pattern> <your-file>

Und wenn Ihnen die Groß-/Kleinschreibung egal ist:

less -i -p <your-pattern> <your-file>

Dies hat auch den Vorteil, dass Seiten vorhanden sind, was bei langen Ausgaben eine gute Sache ist

15
acros

Du kannst es nur mit grep machen, indem du:

  1. zeilenweises Lesen der Datei
  2. zuordnen eines Musters in jeder Zeile und Hervorheben des Musters mit grep
  3. wenn es keine Übereinstimmung gibt, geben Sie die Zeile unverändert wieder

was dir folgendes gibt:

while read line ; do (echo $line | grep PATTERN) || echo $line  ; done < inputfile
4
jackhab

Wenn Sie "alle" Zeilen drucken möchten, gibt es eine einfache Lösung:

grep "test" -A 9999999 -B 9999999
  • A => Nachher
  • B => Vorher
2
Leon X. W.

Wenn Sie dies tun, weil Sie mehr Kontext in Ihrer Suche haben möchten, können Sie dies tun:

cat BIG_FILE.txt | less

Eine Suche in less sollte Ihre Suchbegriffe hervorheben.

Oder leiten Sie die Ausgabe an Ihren Lieblingseditor weiter. Ein Beispiel :

cat BIG_FILE.txt | vim -

Dann suchen/markieren/ersetzen.

0
dgo.a