Ich suche ein Verzeichnis rekursiv mit grep mit den folgenden Argumenten in der Hoffnung, nur die erste Übereinstimmung zurückzugeben. Leider gibt es mehr als eins zurück - tatsächlich zwei, als ich das letzte Mal nachgesehen habe. Es scheint, als hätte ich zu viele Argumente, insbesondere ohne das gewünschte Ergebnis zu erzielen. : - /
# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory
kehrt zurück:
Pulsanti Operietur
Pulsanti Operietur
Vielleicht ist grep nicht der beste Weg, dies zu tun? Du sagst mir, vielen Dank.
-r
offensichtlich), aber sie sollten nicht weh tun (ich würde es aber nicht benutzen-a
)grep -m 1
aus diesem Grund beide Instanzen zurückgegeben.|head -1
Ich habe es gelöst!first not first from result
. Diese Antwort druckt die erste Übereinstimmung in einer beliebigen Datei und stoppt. Was hast du noch erwartet?Sie können das
grep
Ergebnishead
in Verbindung mit stdbuf weiterleiten .Beachten Sie, dass Sie Folgendes verwenden müssen
stdbuf
, um sicherzustellen, dassgrep
die Ausgabe nicht gepuffert wird, um das Stoppen nach dem N-ten Match sicherzustellen :Sobald eine
head
Leitung verbraucht ist, wird sie beendet undgrep
empfangen,SIGPIPE
da sie noch etwas an die Pipe ausgibt, während siehead
weg war.Dies setzte voraus, dass keine Dateinamen Zeilenumbrüche enthalten.
quelle
xargs
:find . -name '*.gz' | xargs -I '{}' stdbuf -oL zgrep -al 'pattern' {} | head -n 1
. Dies endet jedoch nicht beim ersten Spiel. Irgendein Rat?grep
die--line-buffered
Option nicht den Pufferaufwand verhindern, ohne ein zusätzliches Dienstprogramm aufzurufen?Mein grep-a-like-Programm
ack
verfügt über eine-1
Option, die beim ersten Spiel endet, das irgendwo gefunden wurde. Es unterstützt auch das-m 1
, worauf sich @mvp bezieht. Ich habe es dort abgelegt, denn wenn ich einen großen Quellcodebaum durchsuche, um etwas zu finden, von dem ich weiß, dass es nur in einer Datei vorhanden ist, ist es nicht erforderlich, es zu finden und muss Strg-C drücken.quelle
ag
dies schnell gehen kann, aber es gibt nicht die-1
Option, die in diesem Fall nützlich istSie können den folgenden Befehl verwenden, wenn Sie die gesamte Zeile und den Dateinamen drucken möchten, wenn ein bestimmtes Wort im aktuellen Verzeichnis vorkommt, das Sie suchen.
quelle
Ein einzelner Liner mit
find
:quelle
grep -r
arbeitet viel schneller - es ist nur eine Kopie, die Verzeichnisdurchläufe durchführt.