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 .

4voto

F. Hauri Punkte 57640

El sed Weg

Da es bereits viele verschiedene Lösungen gibt, aber keine zeigt sed als Lösung,

und weil sed ist leichter und schneller als grep Ich bevorzuge die Verwendung von sed für diese Art von Arbeit:

sed 's/pattern/\o33[47;31;1m&\e[0m/' file

Dies erscheint weniger intuitiv.

  • \o33 ist die sed Syntax zur Erzeugung von Zeichen octal 033 -> Escape .
  • Esc [ 47 ; 31 ; 1 m sind ANSI-Escape-Code : Hintergrund grau, Vordergrund rot und fette Schrift.
  • & wird die Muster
  • Esc [ 0 m zur Standardeinstellung zurückkehren.

Auf diese Weise können Sie die gesamte Linie aufhellen, aber das Markierungsmuster ist rot:

sed <file -e \
    's/^\(.*\)\(234\)\(.*\)/\o33[47m\1\o33[31;1m\2\o33[0;47m\3\o33[0m/'

Dynamisch tail -f folgende Logdateien

Einer der Vorteile der Verwendung von sed : Sie könnten eine Alarmton auf der Konsole, mit Glocke Ascii-Zeichen 0x7 . Ich verwende oft sed wie:

sudo tail -f /var/log/kern.log |
    sed -ue 's/[lL]ink .*\([uU]p\|[dD]own\)/\o33[47;31;1m&\o33[0m\o7/'
  • -u stehen für ungepuffert . Die Leitung wird also sofort behandelt.

Ich höre also einen Piepton, wenn ich das Ethernet-Kabel anschließe oder abziehe.

Natürlich, statt der link up Muster, könnten Sie auf Folgendes achten USB in derselben Datei, oder sogar die Suche nach from= in einigen /var/log/mail.log ...

3voto

treulz Punkte 51

Zum Hervorheben von Mustern bei der Anzeige der gesamten Datei, h kann dies tun.

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

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

Sie können auch die Ausgabe von h a less -R zum besseren Lesen.

Für grep und 1 Farbe für jedes Muster verwenden, cxpgrep könnte eine gute Lösung sein.

3voto

Bruce Edge Punkte 1735

Verwenden Sie ripgrep, auch bekannt als rg: https://github.com/BurntSushi/ripgrep

rg --passthru...

Farbe ist die Standardeinstellung:

enter image description here

  rg -t tf -e  'key.*tfstate' -e dynamodb_table
       --passthru
       Print both matching and non-matching lines.

       Another way to achieve a similar effect is by modifying your pattern to
       match the empty string. 
       For example, if you are searching using rg foo then using 
       rg "^|foo" instead will emit every line in every file searched, but only
       occurrences of foo will be highlighted. 
       This flag enables the same behavior without needing to modify the pattern.

Ein Sakrileg, zugegeben, aber grep ist selbstgefällig geworden.

brew/apt/rpm/whatever install ripgrep

Sie werden nie wieder zurückgehen.

2voto

fly_a320 Punkte 11

Eine andere schmutzige Art:

grep -A80 -B80 --color FIND_THIS IN_FILE

Ich habe eine

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

in bashrc.

1voto

MarkHu Punkte 1575

In einer anderen Antwort wurde der Schalter -Cn von grep erwähnt, der n Zeilen Context einschließt. Ich mache das manchmal mit n=99, um auf die Schnelle [zumindest] einen ganzen Bildschirm voll Context zu bekommen, wenn mir das egrep-Muster zu umständlich erscheint, oder wenn ich auf einem Rechner bin, auf dem ich rcg und/oder ccze nicht installiert habe.

Ich habe vor kurzem entdeckt ccze der ein leistungsfähigeres Färbemittel ist. Meine einzige Beschwerde ist, dass es bildschirmorientiert ist (wie less (die ich aus diesem Grund nie verwende), es sei denn, Sie geben den Schalter -A für die "raw ANSI"-Ausgabe an.

+1 für die rcg oben erwähnt. Es ist immer noch mein Favorit, da es so einfach ist, es in einem Alias anzupassen. So etwas steht normalerweise in meiner ~/.bashrc:

alias tailc='tail -f /my/app/log/file | rcg sendet "BOLD GREEN" empfängt "CYAN" Fehler "RED"'

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