GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Markieren Sie Text ähnlich wie grep, aber filtern Sie keinen Text heraus

Verwenden Sie ack. Überprüfen Sie seinen --passthru Option hier:ack. Es hat den zusätzlichen Vorteil, dass es vollständige reguläre Perl-Ausdrücke erlaubt.

$ ack --passthru 'pattern1' file_name

$ command_here | ack --passthru 'pattern1'

Sie können dies auch mit grep wie folgt tun:

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

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

Dadurch werden alle Linien abgeglichen und die Muster hervorgehoben. Die ^ stimmt mit jedem Zeilenanfang überein, wird aber nicht gedruckt/hervorgehoben, da es kein Zeichen ist.

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


Sie können sicherstellen, dass alle Zeilen übereinstimmen, aber bei irrelevanten Übereinstimmungen gibt es nichts hervorzuheben

egrep --color 'apple|' test.txt 

Hinweise:

  • egrep kann auch grep -E geschrieben werden
  • --color ist normalerweise in den meisten Distributionen standardmäßig
  • Einige Varianten von grep "optimieren" die leere Übereinstimmung, daher sollten Sie stattdessen "apple|$" verwenden (siehe:https://stackoverflow.com/a/13979036/939457)

BEARBEITEN:

Dies funktioniert mit grep von OS X Mountain Lion:

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

Das ist besser als '^|pattern1|pattern2' weil die ^ Ein Teil der Alternation passt zum Anfang der Zeile, während der $ Übereinstimmungen am Ende der Zeile. Einige Engines für reguläre Ausdrücke heben pattern1 nicht hervor oder pattern2 weil ^ bereits abgestimmt und die Engine ist eifrig .

Etwas Ähnliches passiert für 'pattern1|pattern2|' weil die Regex-Engine bemerkt, dass die leere Alternation am Ende der Musterzeichenfolge mit dem Anfang der Ausgangszeichenfolge ü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 stecken bleiben , das könnte funktionieren:

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

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

Die zweite grep entfernt nur überflüssiges -- Zeilen, die durch den BSD-Stil grep eingefügt wurden auf Mac OS X Mountain Lion, auch wenn sich der Kontext aufeinanderfolgender Spiele überschneidet.

Ich dachte, GNU grep hätte -- weggelassen Zeilen, wenn sich der Kontext überschneidet, aber es ist schon eine Weile her, also erinnere ich mich vielleicht falsch.


Linux
  1. Wie hebt man ein Wort in der Ausgabe von „Katze“ hervor?

  2. Eine .gz-Datei entpacken, um eine Textdatei zu erhalten, aber eine Binärdatei erhalten?

  3. VPS vs. VPN – Ähnliche Namen, aber völlig unterschiedliche Funktionen

  4. So aktivieren Sie die Textfarbe in vi ähnlich wie vim in CentOS/RHEL

  5. Entfernen Sie leere Zeilen in einer Textdatei mit grep

Grep-Befehl in Linux (Text in Dateien suchen)

Bearbeiten von Text mit sed und grep

Bearbeiten von Text in der Befehlszeile mit grep

3 unverzichtbare Linux-Befehle zur Textbearbeitung

So extrahieren Sie E-Mail-Adressen aus einer Textdatei unter Linux

Finden Sie Text in Dateien unter Linux mit grep