grep: wie färbt man 2 schlüsselwörter ein?


12

Ich weiß, wie man 2 Schlüsselwörter mit 1 Befehl grept, aber ich kann nur eines davon in der Ausgabe färben. Hier ist mein Befehl:

grep 'keyword1' file.log | grep 'keyword2'

Nur keyword2wird hervorgehoben. Wie kann ich gleichzeitig keyword1hervorheben?

Antworten:


15

Der grepBefehl akzeptiert eine --color=alwaysOption, die Sie verwenden können

grep 'keyword1' file.log --color=always | grep 'keyword2'

Wie gertvdijk betont, ist dieser Befehl möglicherweise ineffizient, sucht jedoch nach allen Zeilen, die sowohl keyword1 als auch keyword2 enthalten. Wenn Sie sie in verschiedenen Farben hervorheben möchten, können Sie verwenden

grep 'keyword1' file.log --color=always | GREP_COLORS="mt=01;34" grep --color=always 'keyword2'

Dadurch wird Keyword2 blau hervorgehoben. Der mtTeil bedeutet, dass grepmit diesem CSI-Code übereinstimmender Text hervorgehoben wird , und 01;34bedeutet "fetter blauer Vordergrund auf normalem Hintergrund".


1
+1 für detaillierte Erklärungen und Anpassungsoptionen für den Anwendungsfall!
gertvdijk

Komisch, wenn ich das mit grep -R --color = always keyword1 versuche. | grep keyword2 // Nur das erste Keyword wird hervorgehoben. Wie könnte ich Ihre Antwort anpassen, um mit rekursiver Suche zu arbeiten?
TenLeftFingers

1
Das ist seltsam, grep -R --color=always keyword1 . | grep keyword2sollte funktionieren. Leiten Sie die Ausgabe erneut um (z. B. durch Weiterleiten der Sekunde grepan less -R)? In diesem Fall müssen Sie --color=alwaysauch die zweite hinzufügen .
Daniel H

Gute Antwort! Um beides hervorzuheben, --color=autowäre für die Sekunde grepunmittelbar danach ein erforderlich 'keyword2'.
Luis

@ Luis Ja, Sie haben Recht, dass Grep zumindest häufig standardmäßig keine Farbe verwendet (obwohl dies eine Option zum Konfigurieren der Zeit sein könnte? Ich glaube nicht, dass ich das 2013 außer Kraft gesetzt hatte, als es auf meinem Computer ohne diese Option funktionierte…). Ich --color=alwayshabe die Antwort ergänzt, weil du sie vielleicht weiterleiten willst lessoder so.
Daniel H

3

Versuchen Sie es mit regulären Ausdrücken, anstatt sie an eine andere Instanz weiterzuleiten grep, z.

grep -E "\<foo\>.*\<bar\>" file

Dies beschränkt sich leider nur auf übereinstimmende Zeilen, in denen die Schlüsselwörter in dieser Reihenfolge übereinstimmen. Wie auch immer, die Verwendung von grepin Ihrer Frage ist eher ineffizient und Sie sollten es vermeiden. Die Antwort von @DanielH ist für Ihren Fall wahrscheinlich viel einfacher.

Für ein 'oder' Matching von Keywords verwende ich dies regelmäßig:

grep -E "(foo|bar)" file

1
Ich denke, dass das OP nur Zeilen möchte, die beide Schlüsselwörter enthalten (der Befehl, den Sie gaben, gibt alle Zeilen an, die eine von beiden enthalten).
Daniel H

@DanielH Danke für den Hinweis. Ich habe meine Antwort aktualisiert.
gertvdijk

Funktioniert das nicht immer noch nur, wenn foo vor der Bar kommt? Ich weiß nicht, ob es einen besseren Weg gibt als foo.*bar|bar.*foo, oder ob dies für diesen Fall überhaupt notwendig ist (das scheint eine Protokolldatei zu sein, die wahrscheinlich eine Standardreihenfolge für die Schlüsselwörter haben würde). Ich habe meine Antwort hinzugefügt, bevor Sie Ihre aktualisiert haben, aber ich behalte sie für den Fall bei, dass verkettete greps wirklich erforderlich sind (oder zu einem anderen Zeitpunkt sollte keine farbige Ausgabe an das Terminal gesendet werden, z. B. grep | less -R).
Daniel H
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.