Utiliser grep ou awk

Pour capturer un model particulier, awk et grep peuvent être utilisés. Pourquoi devrions-nous l'utiliser l'un sur l'autre? Comment cela fonctionne-t-il en arrière-plan? Lequel est le plus rapide et pourquoi? Par exemple

Si j'avais un file journal et que je voulais prendre un certain model, je pourrais faire l'une des choses suivantes

 awk '/pattern/' /var/log/messages 

ou

 grep 'pattern' /var/log/messages 

Je n'ai pas fait de benchmarking, donc je ne saurais pas. Quelqu'un peut-il élaborer cela?

grep sera probablement 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ù grep est un programme c-code compilé (optimisé pour la search de patterns dans les files).

(Note – J'ai exécuté les deux commands deux fois afin que la caching ne puisse pas fausser les résultats)

Plus de détails sur les langages interprétés sur wikipedia.

Comme Stephane l'a souligné à juste titre dans les commentaires, votre kilométrage peut varier en fonction de l'implémentation du grep et de l'awk que vous utilisez, du operating system utilisé et du jeu de caractères que vous traitez.

Utilisez l'outil le plus spécifique et le plus expressif. L'outil qui correspond le mieux à votre cas d'utilisation est susceptible d'être le plus rapide.

À titre indicatif:

  • searchr des lignes correspondant à une sous-string ou une expression rationnelle? Utilisez grep.
  • sélectionner certaines colonnes à partir d'un file simplement délimité? Utilisez couper.
  • effectuer des substitutions basées sur des templates ou … d'autres choses que sed peut raisonnablement faire? Utilisez sed.
  • besoin d'une combinaison des 3 ci-dessus, ou printf formatting, ou des loops et des twigs d'usage général? Utilisez awk.

Lorsque vous searchz uniquement des strings et que la vitesse count, vous devriez presque toujours utiliser grep . C'est des ordres de grandeur plus rapide que awk quand il s'agit de searchs grossières.

source Les différences fonctionnelles et de performance de sed, awk et d'autres utilitaires d'parsing 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 

En résumé, grep ne fait qu'une seule chose comme autant d'autres outils UNIX et cela correspond à une ligne au model donné et il le fait bien. D'autre part, awk est un outil plus sophistiqué car c'est un langage de programmation complet défini par le standard POSIX avec des caractéristiques typiques comme les variables, les arrays, les expressions, les fonctions ou les instructions de contrôle pour la numérisation et le traitement des patterns.

À mon avis, cela dépend de la mise en œuvre des deux outils en cas de correspondance de motifs et de la taille de certaines inputs que vous voulez traiter. Je m'attendrais à ce que grep est généralement plus efficace que awk car il ne correspond que. Mais vous ne pouvez pas écrire avec grep un code simple pour effectuer des tâches plus complexes comme le traitement ultérieur des loggings correspondants, le calcul ou l'printing des résultats sans utiliser d'autres outils.

Bien que je convienne que dans la théorie grep devrait être plus rapide que awk , en pratique, YMMV car cela dépend beaucoup de la mise en œuvre que vous utilisez.

ici en comparant 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 file de 240Mo de lignes de 2.5M 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 

Dans la locale C, seul GNU grep reçoit un coup de pouce significatif et devient plus rapide que mawk .

L'set de données, le type de l'expression rationnelle peut également faire une grande différence. Pour les regexps, awk devrait être comparé à grep -E car les regexps de awk sont des ER étendus.

Pour cet set de données, awk pourrait être plus rapide que grep sur les systèmes ou systèmes basés sur busybox où mawk est le awk par défaut et l'environnement local par défaut est basé sur UTF-8 (IIRC, c'était le cas dans Ubuntu).