Wenn ich Sie richtig verstehe, möchten Sie Folgendes tun:
find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt
Find
Alle Dateien mit der Erweiterung py
, grep
nur Zeilen, in denen something
die Zeilen enthalten und gespeichert sind output.txt
. Wenn die Datei etwas enthält, wird sie ersetzt.
Bearbeiten: Mit -exec:
find . -name '*.py' -exec grep 'something' {} \; > output.txt
Ich beziehe Chris Downs Kommentar hier ein. Der obige Befehl wird grep
so oft ausgeführt, wie find
Vorkommen gefunden werden. Wenn Sie jedoch das ;
durch a ersetzen +
, grep
wird mit der Ausgabe von find
verkettet (bis zu einer bestimmten Grenze) aufgerufen . Weitere Informationen zu diesem Thema finden Sie in der Frage Verwenden von Semikolon (;) vs plus (+) mit exec in find .
+
stattdessen\;
, um die Ausführungszeit erheblich zu verkürzen (da Argumente vor der Ausführung verkettet werden, bisARG_MAX
).grep -H
Sie diese Option, wenn Sie den Dateinamen der Datei in die Ausgabe aufnehmen möchten.Wenn Sie alle übereinstimmenden Zeilen in allen Dateien speichern möchten,
output.txt
funktioniert Ihr letzter Befehl, außer dass Sie die erforderlichen Zeilen;
am Ende des Befehls fehlen .Wenn Sie möchten, dass bei jedem Durchlauf
grep
eine Ausgabe in eine andere Datei erfolgt, führen Sie eine Shell aus, um den Namen der Ausgabedatei zu berechnen und die Umleitung durchzuführen.quelle
find . -name "*.py" -type f -exec grep "something" {} \; -print > output.txt
Und wenn Sie die Zeilennummern der Grep'ed-Zeilen sehen möchten, können Sie natürlichgrep -n "something"
Für den Datensatz
grep
gibt es--include
und--exclude
Argumente, mit denen Sie die von ihm durchsuchten Dateien filtern können:quelle
grep
.Verwendung
tee
:Der Nachteil ist , wenn Sie alle Dateien mit Sonderzeichen (inklusive Leerzeichen) , dass
xargs
undgrep
nicht gut mit (a file.txt
als zwei Dateien interpretiert werden,a
undfile.txt
). Die Alternative dazu ist, entweder das-x
oder zu verwenden-print0
, aber eines davon verschmutzt Ihroutput.txt
. Das-x
wird verwendet\
, um bestimmte Sonderzeichen zu maskieren, und dies wird inoutput.txt
. Das-print0
verwendet ein Null-Byte als Feldtrennzeichen (was ebenfalls erforderlich istxargs -0
) undoutput.txt
sieht aus wie eine lange zusammenhängende Textzeile.Wie Sie damit umgehen (oder nicht), liegt bei Ihnen.
quelle