Comment utiliser grep efficacement?
J'ai un grand nombre de petits fichiers à rechercher. J'ai été à la recherche d'un bon de facto version multi-thread de grep
, mais ne pouvait pas trouver quoi que ce soit. Comment puis-je améliorer mon utilisation de grep? A partir de maintenant je suis en train de faire ceci:
grep -R "string" >> Strings
Vous devez vous connecter pour publier un commentaire.
Si vous avez xargs installé sur un processeur multi-core, vous pouvez bénéficier des avantages suivants juste au cas où quelqu'un est intéressé.
Environnement:
Tests:
1. Trouver les fichiers nécessaires, pipe à xargs et dites lui d'exécuter 8 cas.
2. Trouver les fichiers nécessaires, pipe à xargs et dites lui d'exécuter des 4 instances.
3. Suggéré par @Stephen: Trouver les fichiers nécessaires et les utiliser + au lieu de xargs
4. Régulière récursive grep.
Pour ma part, la première commande a très bien fonctionné.
-print0
avec xarg de-0
pour délimiter les noms de fichiers avec l'université nationale du lesotho caractère, de sorte que vous n'avez pas d'ennuis avec les noms de fichiers avec des espaces, retours à la ligne ou d'autres caractères illisibles dans leur nom.time find ./ -name "*.ext" -exec grep -H "string" {} \+ >> Strings_findExec
(le\+
de cessation de la trouver qui font essentiellement la même que lafind|xargs
combo)xargs
vous permet d'utiliser multiprocesseur la capacité à la-P
drapeau alors que la POSIX-2004 conforme versions defind
qui peuvent être résiliés avec+
agir comme si vous passiez-P1
àxargs
, c'est à dire une seule utilisation du processeurgrep -R "string" >> Strings
version?xargs -P
n'? Après j'ai entendu parler de ce commutateur pourxargs
, je n'ai jamais vraiment compris le but de GNU parallèle.-n1
àxargs
? Sur mes tests, il est 20 fois plus rapide sans cette option (ou avec une juste valeur comme-n 1024
).Vous demandez-vous pourquoi
-n1
est utilisé ci-dessous n'est-ce pas plus rapide d'utiliser une valeur plus élevée (disons -n8? ou laissez donc xargs va faire la bonne chose)?Semble qu'il sera plus efficace de donner à chaque grep c'est fourchue de processus sur plus d'un fichier (je suppose -n1 permettra de donner un seul nom de fichier dans argv pour le grep) -- comme je le vois, nous devrions être en mesure de donner le plus n possible sur le système (basé sur
argc/argv
max limitation de longueur). De sorte que la configuration coût de la mise en place d'un nouveau processus grep n'est pas engagé plus souvent.find
renvoie un grand nombre de fichiers, et même si cela ne se produit pas, je doutexargs
est un très bon moyen de savoir à l'avance combien de fichiers de donner à chaque instance de grep. La croisée des frais généraux dépendra du fichier de la taille moyenne des cours et une mauvaise combinaison de n de petits fichiers pour ungrep
et n très grand l'un pour l'autre peut consommer jusqu'même n=2 très facilement. Sur mes téléchargements dir, j'ai choisi une valeur de n=64 hors de l'air mince bien et a gagné 3%, bien que.