Ich habe eine Verzeichnisstruktur basierend auf Ereignissen.
In diesen Fällen habe ich einen Dateityp, der ein Muster enthält oder nicht, nach dem ich suchen muss. Die positiven Ergebnisse möchte ich in einer separaten Datei speichern.
Mein erster Ansatz war:
find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file
aber das scheint nicht zu funktionieren. Mir wurde gesagt , dass es nicht möglich zu kombinieren find
und grep
auf diese Weise, so wie muss ich es tun?
find . /EVENT*/'filename'
und dann alles ausführen , was dieser Befehl auf seinem Standard druckt Ausgabe (die im Fallfind
von standardmäßig eine Liste von Dateinamen ist) und übergeben Sie diese als Standardeingabe an den Befehlgrep 'searchtext' head -2
(was nicht viel Sinn macht, dagrep
stdin bei gegebenen Dateinamen nicht angezeigt wird ) Standardausgabe vongrep
in die Datei umleitenerror_file
./EVENT*/'filename'
. Ich bin mir nicht sicher, wie ich das machen sollfind
, und AFAIKbash
kann das nicht. Alle bisherigen Antworten haben dies verpasst.Antworten:
Hier ist ein allgemeines Muster:
Hier werden zunächst
find
alle Dateien im Verzeichnis durchsucht, die die erforderlichen Dateien enthalten. Sie können auch Platzhalter verwenden, z. B.*.txt
um nur nach Dateien zu suchen, die mit enden.txt
. In diesem Fall wäre der Befehl:Nachdem wir die erforderlichen Dateien gefunden haben, suchen wir nach dem gewünschten Muster in diesen Dateien mit
-exec grep -H 'pattern_to_search' {} +
(-H
druckt den Dateinamen, in dem das Muster gefunden wird). Hier können Sie sich vorstellen{}
, dass sie die zu durchsuchenden Dateien enthalten und+
am Ende mit verwendet-exec
werden müssen,-exec
damit sie nur einmal gegabelt werden, dhgrep
so suchen, als ob der Befehl lautetgrep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt
.quelle
/dev/null
sichergestellt wird, dass mindestens zwei vorhanden sind, wenn es eine gibt Spiel. Die Verwendung-H
scheint jedoch eine normativere, weniger verrückte Methode (und weniger Typisierung) zu sein. Ich würde es'{}'
, nicht einfach{}
. Sonst bekomme ichmissing argument to -exec
.Eine andere gültige Methode ist:
Die Option print0 / -0 soll den Fall berücksichtigen, in dem Dateinamenzeichenfolgen Sonderzeichen (wie Leerzeichen) enthalten.
quelle
-exec grep "test to search" {} +
Handles Dateinamen mit Sonderzeichen ganz gut. Der einzige Grund, es nicht zu verwenden, ist, dass einige Systeme es nicht unterstützen.Und noch eine Art und Weise, in nur einen einzigen Prozess (ohne
find
,-exec
,xargs
):Na ja, mit GNU grep jedenfalls. :) :)
ETA: Da ich gebeten wurde, die
grep --include
Option anzuzeigen, ist hier ein Analogon zu Heemayls Beispiel ("Sie können auch Platzhalter verwenden, z. B. * .txt, um nur nach Dateien zu suchen, die mit .txt enden"):Und während ich bearbeite, sind dies Alternativen, keine Drop-In-Ersetzungen: Diese Befehle lesen (reguläre) Dateien über Symlinks. (Sie werden jedoch nicht durch mit Symlinks verknüpfte Verzeichnisse wiederholt
-R
. Dazu benötigen Sie.) Sie lesen auch Sockets, Named Pipes und Gerätedateien (-D skip
können jedoch hinzugefügt werden, ähm, überspringen Sie diese). Und es gibt keine Möglichkeitgrep
, die Wirkung vonfind
Optionen wie zu erzielen-mtime -2
. Wenn Sie diese brauchen - verwenden Siefind
. Wenn Sie dies nicht tun, würde ich behaupten, dass diesgrep
eine gute Alternative ist.quelle
find
Muster entsprechen.find
Muster. Außer, Sie können auch Muster gebengrep -r
; am häufigsten--exclude=GLOB
(oder--include=GLOB
) und--exclude-dir=GLOB
, obwohl ich denke, dass Sie manchmal brauchen-D skip
und / oder-I
. Aber sicher, wenn Sie haben-mtime -2
oder so, brauchen Sie dasfind
.grep -r
ist eine andere Option, kein Ersatz.--include
aber? Der ursprüngliche Ansatz, der nicht funktioniert, hat keine angegeben. Obwohl ich denke, ich könnte ein Analogon zu Heemayls Beispiel hinzufügen, das man auch verwenden kann…Ich gehe davon aus, dass Sie durch Textdateien nach einem bestimmten Muster suchen und durch Unterverzeichnisse rekursieren müssen. Wenn Sie GNU grep verwenden, ist es ziemlich einfach:
Stattdessen
-r
können Sie-R
oder verwenden--recursive
Sie müssen Anführungszeichen verwenden, wenn Ihr Suchmuster Leerzeichen enthält.
Es gibt viele Optionen für GNU grep. Geben
grep --help
Sie einfach ein und Sie werden begeistert sein!quelle
ag SearchWord FilePattern