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 .

0voto

Edoot Punkte 371

Wenn Sie mehrere Muster mit verschiedenen Farben hervorheben möchten, siehe diese Bash-Skript.

Grundlegende Verwendung:

echo warn error debug info 10 nil | colog

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

0voto

dimo414 Punkte 44554

Hier ist mein Ansatz inspiriert von der Lösung von @kepkin:

# Adds ANSI colors to matched terms, similar to grep --color but without
# filtering unmatched lines. Example:
#   noisy_command | highlight ERROR INFO
#
# Each argument is passed into sed as a matching pattern and matches are
# colored. Multiple arguments will use separate colors.
#
# Inspired by https://stackoverflow.com/a/25357856
highlight() {
  # color cycles from 0-5, (shifted 31-36), i.e. r,g,y,b,m,c
  local color=0 patterns=()
  for term in "$@"; do
    patterns+=("$(printf 's|%s|\e[%sm\\0\e[0m|g' "${term//|/\\|}" "$(( color+31 ))")")
    color=$(( (color+1) % 6 ))
  done
  sed -f <(printf '%s\n' "${patterns[@]}")
}

Diese Funktion akzeptiert mehrere Argumente (lässt Sie aber die Farben nicht anpassen). Beispiel:

$ noisy_command | highlight ERROR WARN

0voto

Dr. Alex RE Punkte 1534

Gibt es eine Möglichkeit, grep anzuweisen, jede gelesene Zeile auszugeben unabhängig davon, ob es eine Übereinstimmung gibt?

Option -C999 erfüllt den Zweck, wenn es keine Option gibt, die alle Kontextzeilen anzeigt. Die meisten anderen grep-Varianten unterstützen dies ebenfalls. Allerdings: 1) wird keine Ausgabe erzeugt, wenn keine Übereinstimmung gefunden wird und 2) hat diese Option einen negativen Einfluss auf die Effizienz von grep: wenn die -C Wert groß ist, müssen unter Umständen so viele Zeilen im Speicher zwischengespeichert werden, damit grep bestimmen kann, welche Zeilen des Kontexts bei einem Treffer angezeigt werden sollen. Beachten Sie, dass grep-Implementierungen keine Eingabedateien laden, sondern eher ein paar Zeilen lesen oder ein gleitendes Fenster über die Eingabe verwenden. Der "Vorher"-Teil des Kontexts muss in einem Fenster (Speicher) aufbewahrt werden, um die "Vorher"-Kontextzeilen später auszugeben, wenn eine Übereinstimmung gefunden wird.

Ein Muster wie ^|PATTERN o PATTERN|$ oder ein beliebiges leeres Teilmuster, wie zum Beispiel [^ -~]?|PATTERN ist ein netter Trick. Allerdings werden 1) bei diesen Mustern nicht übereinstimmende Zeilen nicht als Kontext hervorgehoben und 2) kann dies nicht in Kombination mit einigen anderen grep-Optionen verwendet werden, wie -F y -w zum Beispiel.

Keiner dieser Ansätze ist also für mich zufriedenstellend. Ich verwende ugrep und erweitertes grep mit der Option -y um alle nicht übereinstimmenden Ausgaben effizient als farblich hervorgehobene Kontextzeilen anzuzeigen. Andere grep-ähnliche Werkzeuge wie ag und ripgrep bieten ebenfalls eine Pass-Through-Option. Aber ugrep ist kompatibel mit GNU/BSD grep und bietet eine Obermenge von grep-Optionen wie -y y -Q . Hier ein Beispiel für eine Option -y zeigt in Kombination mit -Q (interaktive Abfrage-UI zur Eingabe von Mustern):

ugrep -Q -y FILE ...

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