653 Stimmen

Farbiges grep - Anzeige der gesamten Datei mit hervorgehobenen Übereinstimmungen

Ich finde grep 's --color=always Flagge als äußerst nützlich erweisen. Allerdings gibt grep nur Zeilen mit Übereinstimmungen aus (es sei denn, Sie fragen nach Kontextzeilen). Da jede ausgegebene Zeile eine Übereinstimmung aufweist, bringt die Hervorhebung nicht so viel, wie sie könnte.

Ich würde wirklich gerne cat eine Datei und sehen Sie die gesamte Datei mit den hervorgehobenen Mustertreffern.

Gibt es eine Möglichkeit, wie ich grep anweisen kann, jede gelesene Zeile auszugeben, unabhängig davon, ob es eine Übereinstimmung gibt? Ich weiß, dass ich ein Skript schreiben könnte, um grep auf jeder Zeile einer Datei laufen zu lassen, aber ich war neugierig, ob dies mit Standard grep .

20voto

user2683246 Punkte 3139

Utilice colout Programm: http://nojhan.github.io/colout/

Es wurde entwickelt, um farbliche Hervorhebungen zu einem Textstrom hinzuzufügen. Mit einer Regex und einer Farbe (z.B. "rot") wird ein Textstrom mit hervorgehobenen Übereinstimmungen reproduziert. z.B:

# cat logfile but highlight instances of 'ERROR' in red
colout ERROR red <logfile

Sie können mehrere Aufrufe aneinanderreihen, um mehrere verschiedene Farbakzente zu setzen:

tail -f /var/log/nginx/access.log | \
    colout ' 5\d\d ' red | \
    colout ' 4\d\d ' yellow | \
    colout ' 3\d\d ' cyan | \
    colout ' 2\d\d ' green

Sie können dasselbe erreichen, indem Sie eine Regex mit N Gruppen (eingeklammerte Teile der Regex), gefolgt von einer durch Komma getrennten Liste von N Farben, verwenden.

vagrant status | \
    colout \
        '\''(^.+  running)|(^.+suspended)|(^.+not running)'\'' \
        green,yellow,red

20voto

Abhishek Jaisingh Punkte 1416

El -z Option für grep ist auch ziemlich raffiniert!

cat file1 | grep -z "pattern"

13voto

Angel Punkte 687

Als grep -E '|pattern' wurde bereits vorgeschlagen, ich wollte nur klarstellen, dass es auch möglich ist, eine ganze Zeile zu markieren.

Zum Beispiel, tail -f somelog | grep --color -E '| \[2\].*' (genauer gesagt, der Teil -E '| ):

9voto

uronce Punkte 135

Ich habe dies zu meinen .bash_aliases hinzugefügt:

highlight() {
  grep --color -E "$1|\$"
}

9voto

Ich verwende rcg aus "Linux Server Hacks", O'Reilly. Es ist perfekt für das, was Sie wollen und kann mehrere Ausdrücke jeweils mit verschiedenen Farben hervorheben.

#!/usr/bin/perl -w
#
#       regexp coloured glasses - from Linux Server Hacks from O'Reilly
#
#       eg .rcg "fatal" "BOLD . YELLOW . ON_WHITE"  /var/adm/messages
#
use strict;
use Term::ANSIColor qw(:constants);

my %target = ( );

while (my $arg = shift) {
        my $clr = shift;

        if (($arg =~ /^-/) | !$clr) {
                print "Usage: rcg [regex] [color] [regex] [color] ...\n";
                exit(2);
        }

        #
        # Ugly, lazy, pathetic hack here. [Unquote]
        #
        $target{$arg} = eval($clr);

}

my $rst = RESET;

while(<>) {
        foreach my $x (keys(%target)) {
                s/($x)/$target{$x}$1$rst/g;
        }
        print
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X