it-swarm.com.de

Colorized grep - Anzeigen der gesamten Datei mit hervorgehobenen Übereinstimmungen

Ich finde das --color=always-Flag von grep enorm nützlich. Grep druckt jedoch nur Zeilen mit Übereinstimmungen (sofern Sie nicht nach Kontextzeilen fragen). Da jede Zeile, die gedruckt wird, eine Übereinstimmung aufweist, fügt die Hervorhebung nicht so viele Möglichkeiten hinzu, wie sie könnte.

Ich möchte wirklich eine Datei cat und die gesamte Datei sehen, wobei die Musterübereinstimmungen hervorgehoben sind.

Gibt es eine Möglichkeit, grep anzuweisen, dass jede Zeile gelesen wird, unabhängig davon, ob eine Übereinstimmung vorliegt? Ich weiß, ich könnte ein Skript schreiben, um grep in jeder Zeile einer Datei auszuführen, aber ich war gespannt, ob dies mit dem Standard grep möglich war.

430
zslayton

Hier sind einige Möglichkeiten, dies zu tun:

grep --color -E 'pattern|$' file
grep --color 'pattern\|$' file
egrep --color 'pattern|$' file
700
Ryan Oberoi

Hier ist etwas in der gleichen Richtung. Die Chancen stehen gut, dass Sie sowieso weniger verwenden werden.

less -p pattern file

Das Muster wird hervorgehoben und zum ersten Vorkommen in der Datei gesprungen. 

79

Ich möchte ack - besser empfehlen als grep, ein Suchwerkzeug für Programmierer .

 $ ack --color --passthru --pager = "$ {PAGER: -less -R}" Musterdateien 
 $ ack --color --passthru Musterdateien | weniger -R 
 $ export ACK_PAGER_COLOR = "$ {PAGER: -less -R}" 
 $ ack --passthru-Musterdateien 

Ich liebe es, weil es standardmäßig rekursiv durch Verzeichnisse durchsucht wird (und so viel klüger als grep -r ist), vollständige reguläre Perl-Ausdrücke unterstützt (und nicht POSIXish regex(3) ). Außerdem bietet es beim Durchsuchen vieler Dateien einen viel schöneren Kontext.

46
ephemient

Sie können auch einen Alias ​​erstellen. Fügen Sie diese Funktion in Ihrem .bashrc (oder .bash_profile unter osx) hinzu.

function grepe {
    grep --color -E "$1|$" $2
}

Sie können den Alias ​​jetzt wie folgt verwenden: "ifconfig | grepe inet" oder "grepe css index.html".

(PS: Vergiss nicht source ~/.bashrc, um bashrc in der aktuellen Sitzung neu zu laden)

18
Fabien Sa

Sie können mein highlight-Skript von https://github.com/kepkin/dev-Shell-essentials verwenden.

Es ist besser als grep, da Sie jede Übereinstimmung mit ihrer eigenen Farbe hervorheben können.

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

Screen shot from Github project

15
kepkin

Verwenden Sie das Programm colout: http://nojhan.github.io/colout/

Es wurde entwickelt, um einem Textstrom farbliche Hervorhebungen hinzuzufügen. Bei einem regulären Ausdruck und einer Farbe (z. B. "rot") wird ein Textstrom mit hervorgehobenen Übereinstimmungen wiedergegeben. z.B:

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

Sie können mehrere Aufrufe verketten, um mehrere verschiedene Farbhighlights hinzuzufügen:

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 auch erreichen, indem Sie einen Regex mit N Gruppen (in Klammern stehende Teile des Regex) verwenden, gefolgt von einer durch Kommas getrennten Liste von N Farben.

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

Ich verwende rcg von "Linux Server Hacks", O'Reilly. Es ist perfekt für das, was Sie möchten, und kann mehrere Ausdrücke mit jeweils unterschiedlichen 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
}
7

Ich habe dies zu .bash_aliases hinzugefügt:

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

Um die Muster während der gesamten Datei hervorzuheben, kann h dies tun.

Außerdem werden verschiedene Farben für unterschiedliche Muster verwendet.

cat FILE | h 'PAT1' 'PAT2' ...

Sie können auch die Ausgabe von h an less -R weiterleiten, um das Lesen zu erleichtern.

Wenn Sie 1 Farbe für jedes Muster verwenden möchten, könnte cxpgrep eine gute Passform sein.

2
treulz

Die -z-Option für grep ist auch ziemlich glatt!

cat file1 | grep -z "pattern"
1

ein anderer schmutziger Weg:

grep -A80 -B80 --color FIND_THIS IN_FILE

Ich habe eine

alias grepa='grep -A80 -B80 --color'

in bashrc.

1
fly_a320

Ok, das ist eine Möglichkeit,

wc -l filename

gibt Ihnen die Zeilenzahl - sagen Sie NN, dann können Sie das tun

grep -C NN --color=always filename
1
nik

Hier ist ein Shell-Skript, das die gsub-Funktion von Awk verwendet, um den gesuchten Text durch die richtige Escape-Sequenz zu ersetzen, um ihn hellrot anzuzeigen:

#! /bin/bash
awk -vstr=$1 'BEGIN{repltext=sprintf("%c[1;31;40m&%c[0m", 0x1B,0x1B);}{gsub(str,repltext); print}' $2

Verwenden Sie es wie folgt:

$ ./cgrep pattern [file]

Leider verfügt es nicht über die gesamte Funktionalität von grep.

Weitere Informationen finden Sie in einem Artikel " So You Like Color " im Linux-Journal

1
Wernsey

Eine andere Antwort erwähnte den Schalter grep-n, der n Kontextzeilen enthält. Ich mache dies manchmal mit n = 99 als schnelle und schmutzige Methode, um einen zumindest kontrastreichen Kontext zu erhalten, wenn das Egrep-Muster zu fummelig erscheint oder wenn ich mich auf einer Maschine befinde, auf der ich rcg nicht installiert habe und/oder ccze.

Ich habe kürzlich ccze entdeckt, ein leistungsfähigerer Colorizer. Meine einzige Beschwerde ist, dass es bildschirmorientiert ist (wie less, das ich aus diesem Grund niemals verwende), es sei denn, Sie geben den Schalter -A für die Ausgabe von "rohem ANSI" an.

+1 für die oben erwähnte rcg. Es ist immer noch mein Favorit, da es so einfach ist, einen Aliasnamen anzupassen. So etwas ist normalerweise in meinem ~/.bashrc:

alias ​​tailc = 'tail -f/meine/app/log/Datei | rcg senden "BOLD GREEN" erhalten "CYAN" Fehler "RED" '

1
MarkHu

Ich benutze folgenden Befehl für ähnliche Zwecke:

grep -C 100 searchtext file 

Dies bedeutet, dass in grep 100 * 2 Kontextzeilen vor und nach dem hervorgehobenen Suchtext gedruckt werden. 

0
Al Mamun

Wenn Sie mehrere Muster mit verschiedenen Farben hervorheben möchten, lesen Sie das this bash-Skript.

Grundnutzung:

echo warn error debug info 10 nil | colog

Sie können Muster und Farben ändern, indem Sie eine Taste drücken und dann die Taste drücken.

0
Edoot

Alternativ können Sie The Silver Searcher verwenden

ag <search> --passthrough
0
Andrew Magee