ich weiß, dass
grep -rhI "# Active" > out.txt
gibt jede Zeile aus, die # Active
im durchsuchten Verzeichnis enthalten ist, aber ich möchte den gesamten Inhalt der .txt-Datei, also Beispiel
beispiel.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
Wenn ich also nach „grep“ # Active
suche, soll es nicht nur die Zeile ausgeben, die # Active
diese TXT-Datei enthält, sondern auch alle anderen Zeilen, Beispiel
Ausgabe.txt
Line1
Line2
Line3 # Active
Line4
Line5
etc
Antwort1
Für Nicht-GNU-Versionen von grep
, bei denen es unwahrscheinlich ist, dass sie über verfügen -z
, oder wenn Portabilität erforderlich ist …
grep -q pattern file && cat file
-q
unterdrückt jegliche Ausgabe, aber wie üblich wird der Beendigungsstatus basierend darauf festgelegt, ob eine Musterübereinstimmung gefunden wurde oder nicht. Bei einer Musterübereinstimmung grep
wird der Erfolgscode zurückgegeben 0
, der äquivalent zuWAHRund das ermöglicht die cat
Ausführung des Befehls.
Antwort2
Normalerweise zeigt grep einfach die passende Zeile an:
$ grep -rhI "# Active"
Line3 # Active
Um die gesamte Datei anzuzeigen, fügen Sie das -z
Flag hinzu:
$ grep -rhIz "# Active"
Line1
Line2
Line3 # Active
Line4
Line5
etc
-z
ist eine GNU-Erweiterung, die grep anweist, als Zeilentrennzeichen nicht Newline, sondern ein NUL-Zeichen zu verwenden. Da Textdateien im Allgemeinen keine NUL-Zeichen enthalten, bewirkt dies, dass grep die gesamte Datei liest, als wäre sie eine einzelne Zeile. Wenn eine Übereinstimmung vorliegt, wird folglich die gesamte Datei gedruckt.
Bei BSD/OSX-Versionen von grep ist die NUL-Eingabeoption nicht verfügbar und -z
bedeutet etwas anderes.
Die anderen Grep-Optionen
-r
weist grep an, Dateien und Verzeichnisse rekursiv zu durchsuchen.
-I
weist grep an, Binärdateien zu ignorieren
-h
weist grep an, die Übereinstimmung ohne den angehängten Dateinamen auszudrucken.
Antwort3
sed
Alternative:
sed -e 'H;1h;/PATTERN/!d;x;:do' -e 'n;b do' infile
Dieses Skript funktioniert, indem es Zeilen im h
alten Puffer sammelt (und löscht), bis eine passende Zeile gefunden wird. An diesem Punkt x
ändert es die Puffer und führt die Operation aus n
(d. h. druckt und ruft die nächste Zeile ab), bis keine Eingabe mehr vorhanden ist.
Antwort4
Wenn Sie dies für mehrere Dateien tun möchten:
cat `grep -rIl "# Active" *`
Grep gibt die Liste der Dateinamen zurück und cat druckt sie aus.