Pour capturer un motif particulier, awk
et grep
peut être utilisé. Pourquoi devrions-nous utiliser lun sur lautre? Quest-ce qui est le plus rapide et pourquoi?
Si javais un fichier journal et que je voulais saisir un certain modèle, je pourrais faire lune des opérations suivantes
awk "/pattern/" /var/log/messages
ou
grep "pattern" /var/log/messages
Je nai pas fait de benchmarking, donc je ne le saurais pas. Quelquun peut-il élaborer cela? Il est bon de connaître le fonctionnement interne de ces deux outils.
Commentaires
Réponse
grep sera très probablement être plus rapide:
# time awk "/USAGE/" imapd.log.1 | wc -l 73832 real 0m2.756s user 0m2.740s sys 0m0.020s # time grep "USAGE" imapd.log.1 | wc -l 73832 real 0m0.110s user 0m0.100s sys 0m0.030s
awk est un langage de programmation interprété, où comme grep est un programme de code C compilé (qui est en outre optimisé pour trouver des modèles dans des fichiers) .
(Remarque – Jai exécuté les deux commandes deux fois afin que la mise en cache ne fausserait pas potentiellement les résultats)
Plus de détails sur les langages interprétés sur wikipedia.
Comme Stéphane la souligné à juste titre dans les commentaires, votre kilométrage peut varier en raison de limplémentation de grep et awk que vous utilisez, du système dexploitation sur lequel il se trouve et du jeu de caractères que vous sont en cours de traitement.
Commentaires
- Sans dire quelle implémentation de grep ou awk vous ‘ utilisez et quelle architecture dordinateur et avec quel jeu de caractères système, ces minutages ont peu de valeur.
- la deuxième commande utilisera également le nouveau version mise en cache. Je ne doute pas que grep soit plus rapide, mais pas autant que vos nombres le montrent.
- (donc exécuter awk, grep, awk, grep et publier les résultats du deuxième ensemble de awk et grep 🙂 et FYI , Je vis dans une locale UTF8.
- Assez drôle, avec les outils BSD (sur un Mac), awk (31.74s) est légèrement plus rapide que sed (33.34s), qui est légèrement plus rapide que grep ( 34.21s). Gnu awk les possède tous à 5,24 s, je nai pas ‘ gnu grep ou sed à tester.
- grep devrait être légèrement plus rapide car awk en fait plus avec chacun ligne dentrée plutôt que de simplement rechercher une expression rationnelle dedans, par exemple si un champ est référencé dans le script (dont il ‘ nest pas dans ce cas) awk divisera chaque ligne dentrée en champs en fonction de la valeur du séparateur de champ et remplit les variables intégrées. mais avec ce que vous avez publié, il ne devrait y avoir presque aucune différence. De loin la différence la plus importante entre les expressions rationnelles de correspondance grep et awk wrt est que grep recherche sur toute la ligne une chaîne correspondante, tandis que awk peut rechercher des champs spécifiques et donc fournir plus de précision et moins de fausses correspondances.
Réponse
Utilisez loutil le plus spécifique et le plus expressif. Loutil qui correspond le mieux à votre cas dutilisation est probablement le plus rapide.
À titre indicatif:
- vous recherchez des lignes correspondant à une sous-chaîne ou une expression rationnelle? Utiliser grep.
- sélectionner certaines colonnes dans un fichier simplement délimité? Utilisez cut.
- effectuer des substitutions basées sur des motifs ou … dautres choses que sed peut raisonnablement faire? Utilisez sed.
- Vous avez besoin dune combinaison des 3 ci-dessus, du formatage printf, ou des boucles et des branches à usage général? Utilisez awk.
Commentaires
- +1 sauf utilisez
perl
au lieu deawk
. si vous avez besoin de quelque chose de plus compliqué que grep / cut / sed, alors il y a de fortes chances que awk gagne ‘ t être suffisant et vous avez besoin de quelque chose » complet -blown » - @sds pourquoi pas python à la place
- @RetroCode: python est plus » usage général » que perl; léquivalent dune seule ligne sera probablement beaucoup plus long.
- @sds non, vous navez ‘ pas besoin de perl sauf si vous ‘ va faire autre chose que le traitement de texte. awk convient parfaitement pour le traitement de texte qui ‘ est plus compliqué que grep / cut / sed et en prime, il est fourni en standard sur toutes les installations UNIX, contrairement à perl.
Réponse
Lorsque vous recherchez uniquement des chaînes et que la vitesse compte, vous devriez presque toujours utiliser grep
. Cest des ordres de grandeur plus rapides que awk
quand il sagit dune simple recherche grossière.
source Les différences fonctionnelles et de performances de sed, awk et autres utilitaires danalyse Unix
UTILITY OPERATION TYPE EXECUTION TIME CHARACTERS PROCESSED PER SECOND (10 ITERATIONS) ------- -------------- --------------- ------------------------------- grep search only 41 sec. 489.3 million sed search & replace 4 min. 4 sec. 82.1 million awk search & replace 4 min. 46 sec. 69.8 million Python search & replace 4 min. 50 sec. 69.0 million PHP search & replace 15 min. 44 sec. 21.2 million
Commentaires
- Merci pour ce bel aperçu de tous ces programmes. Il éclaire vraiment dans lobscurité.
- ~ headtilt ~ PHP est là-bas mais Perl nest pas ‘ t?
- De quel
grep
et de quelawk
faites-vous référence? - Il ‘ Ce nest pas vraiment juste pour les autres utils que grep est juste en train de rechercher et ils sont également en train de remplacer.
- Ce sont des nombres complètement faux. Parlez de comparer des pommes et des oranges – cela ‘ revient à dire que vous pouvez seulement trouver une nouvelle voiture sur le site Web A en 5 secondes alors que vous pouvez trouver une voiture , négociez un prix, obtenez un prêt et achetez la voiture sur le site B en 1 heure donc le site A est plus rapide que le site B. Larticle que vous avez cité est complètement faux ‘ s déclarations de vitesse dexécution relative entre grep, sed et awk et il indique également
awk ... has PCRE matching for regular expressions
ce qui est tout simplement faux.
Réponse
Bien que je convienne quen théorie, grep
devrait être plus rapide que awk
, en pratique, YMMV car cela dépend beaucoup de limplémentation que vous utilisez.
comparant ici les grep et awk de busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 sur Debian / Linux 7.0 amd64 (avec glibc 2.17) dans un environnement local UTF-8 sur un fichier de 240 Mo de 2,5 millions de lignes de caractères ASCII uniquement.
$ time busybox grep error error | wc -l 331003 busybox grep error error 8.31s user 0.12s system 99% cpu 8.450 total wc -l 0.07s user 0.11s system 2% cpu 8.448 total $ time busybox awk /error/ error | wc -l 331003 busybox awk /error/ error 2.39s user 0.84s system 98% cpu 3.265 total wc -l 0.12s user 1.23s system 41% cpu 3.264 total $ time grep error error | wc -l 331003 grep error error 0.80s user 0.10s system 99% cpu 0.914 total wc -l 0.00s user 0.11s system 12% cpu 0.913 total $ time mawk /error/ error | wc -l 330803 mawk /error/ error 0.54s user 0.13s system 91% cpu 0.732 total wc -l 0.03s user 0.08s system 14% cpu 0.731 total $ time gawk /error/ error | wc -l 331003 gawk /error/ error 1.37s user 0.12s system 99% cpu 1.494 total wc -l 0.04s user 0.07s system 7% cpu 1.492 total $ time
In le C locale, seul GNU grep obtient un coup de pouce significatif et devient plus rapide que mawk
.
Lensemble de données, le type de lexpression rationnelle peut également faire une grande différence. Pour les expressions régulières, awk
doit être comparée à grep -E
car les expressions rationnelles awk
« sont des RE étendus .
Pour cet ensemble de données, awk
pourrait être plus rapide que grep
sur des systèmes basés sur busybox ou des systèmes où mawk
est la valeur par défaut awk
et la locale par défaut est basée sur UTF-8 (IIRC, cétait le cas dans Ubuntu).
Réponse
En un mot, grep
ne fait quune chose comme beaucoup dautres outils UNIX et que « fait correspondre une ligne au motif donné et il le fait bien. Dautre part, awk
est un outil plus sophistiqué car il sagit dun langage de programmation complet défini par le standard POSIX avec des fonctionnalités typiques telles que des variables, des tableaux, des expressions, des fonctions ou des instructions de contrôle pour le balayage de modèles et En traitement.
À mon avis, cela dépend de la mise en œuvre des performances des deux outils en cas de correspondance de motifs et de la taille de certaines entrées que vous souhaitez traiter. Je mattendrais à ce que grep soit généralement plus efficace que awk car il ne fait que correspondre. Mais vous ne pouvez pas écrire avec grep un code simple pour effectuer des tâches plus complexes comme le traitement ultérieur des enregistrements correspondants, le calcul ou limpression des résultats sans utiliser dautres outils.
time
pour chronométrer le temps nécessaire à lexécution de la commande. Ex:time ls -l
.