J'effectue une recherche récursive dans un répertoire en utilisant grep avec les arguments suivants dans l'espoir de ne renvoyer que la première correspondance. Malheureusement, il en retourne plus d'un - en fait deux la dernière fois que j'ai regardé. Il semble que j'ai trop d'arguments, surtout sans obtenir le résultat souhaité. : - /
# grep -o -a -m 1 -h -r "Pulsanti Operietur" /path/to/directory
Retour:
Pulsanti Operietur
Pulsanti Operietur
Peut-être que grep n'est pas la meilleure façon de le faire? Vous me dites, merci beaucoup.
-r
évidemment), mais ils ne devraient pas faire de mal (je ne les utiliserais pas-a
cependant)grep -m 1
renvoyé les deux instances à cause de cela.|head -1
résolu!first not first from result
. Cette réponse imprime la première correspondance dans n'importe quel fichier et s'arrête. À quoi d'autre vous attendiez-vous?Vous pouvez diriger le
grep
résultat vershead
en conjonction avec stdbuf .Notez que pour garantir l'arrêt après la Nième correspondance, vous devez utiliser
stdbuf
pour vous assurer degrep
ne pas tamponner sa sortie:Dès qu'il
head
consomme 1 ligne, il s'est terminé etgrep
recevraSIGPIPE
car il a toujourshead
sorti quelque chose vers le tuyau alors qu'il était parti.Cela suppose qu'aucun nom de fichier ne contient de nouvelle ligne.
la source
xargs
:find . -name '*.gz' | xargs -I '{}' stdbuf -oL zgrep -al 'pattern' {} | head -n 1
. Cependant, cela ne se termine pas lors du premier match. Aucun conseil?grep
L'--line-buffered
option n'empêcherait -elle pas la surcharge du tampon sans appeler un utilitaire supplémentaire?Mon programme grep-a-like
ack
a une-1
option qui s'arrête à la première correspondance trouvée n'importe où. Il prend également en charge le-m 1
@mvp. Je l'ai mis là-dedans parce que si je recherche un grand arbre de code source pour trouver quelque chose que je sais exister dans un seul fichier, il n'est pas nécessaire de le trouver et je dois appuyer sur Ctrl-C.la source
ag
pourrait être rapide, mais il n'a pas l'-1
option qui est utile dans ce casVous pouvez utiliser la commande ci-dessous si vous souhaitez imprimer la ligne entière et le nom de fichier si l'occurrence d'un mot particulier dans le répertoire actuel que vous recherchez.
la source
Une doublure unique, utilisant
find
:la source
grep -r
fonctionne beaucoup plus rapidement - sa seule copie qui effectue des traversées de répertoire.