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 ...