Utilisation de grep vs awk

17

Pour capturer un motif particulier, awket greppeut être utilisé. Pourquoi devrions-nous utiliser l'un sur l'autre? Quel est le plus rapide et pourquoi?

Si j'avais un fichier journal et que je voulais saisir un certain modèle, je pourrais effectuer l'une des opérations suivantes

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

ou

grep 'pattern' /var/log/messages

Je n'ai fait aucune analyse comparative, donc je ne sais pas. Quelqu'un peut-il élaborer cela? C'est formidable de connaître le fonctionnement interne de ces deux outils.

holasz
la source
Faites précéder toute commande, même les scripts shell, avec la timecommande pour chronométrer le temps qu'il faut pour exécuter la commande. Ex: time ls -l.
Bulrush

Réponses:

26

grep sera très 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ù comme grep est un programme de code c compilé (qui est en outre optimisé pour trouver des modèles dans les fichiers).

(Remarque - J'ai exécuté les deux commandes deux fois de sorte que la mise en cache ne fausserait pas potentiellement les résultats)

Plus de détails sur les langues interprétées sur wikipedia.

Comme Stephane l'a souligné à juste titre dans les commentaires, votre kilométrage peut varier en raison de la mise en œuvre du grep et de l'awk que vous utilisez, du système d'exploitation sur lequel il se trouve et du jeu de caractères que vous traitez.

Drav Sloan
la source
2
Sans dire quelle implémentation grep ou awk vous utilisez et sur quelle architecture d'ordinateur, et avec quel jeu de caractères système, ces timings ont peu de valeur.
Stéphane Chazelas
1
la deuxième commande utilisera également la version nouvellement mise en cache. Je ne doute pas que grep soit plus rapide mais pas autant que le montrent vos chiffres.
exussum
(d'où l'exécution de awk, grep, awk, grep et la publication des résultats du deuxième ensemble de awk et grep :) et FYI, je vis dans un environnement local UTF8.
Drav Sloan
1
Assez drôle, avec les outils BSD (sur 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.24s, je n'ai pas gnu grep ou sed à tester.
Kevin
1
grep devrait être légèrement plus rapide car awk fait plus avec chaque ligne d'entrée que de simplement rechercher une expression rationnelle dedans, par exemple si un champ est référencé dans le script (ce qui n'est pas le cas dans ce cas) awk divisera chaque ligne d'entrée en champs basés sur le valeur de séparateur de champ et il remplit les variables intégrées. mais avec ce que vous avez publié, il ne devrait y avoir presque aucune différence. La différence de loin la plus importante entre grep et awk par rapport aux expressions rationnelles est que grep recherche toute la ligne pour une chaîne correspondante tandis qu'awk peut rechercher des champs spécifiques et ainsi fournir plus de précision et moins de fausses correspondances.
Ed Morton
14

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

À titre indicatif:

  • la recherche de lignes correspondant à une sous-chaîne ou expression rationnelle? Utilisez grep.
  • sélectionner certaines colonnes d'un fichier simplement délimité? Utilisez coupe.
  • effectuer des substitutions basées sur des modèles ou ... d'autres choses que sed peut raisonnablement faire? Utilisez sed.
  • besoin d'une combinaison des 3 ci-dessus, ou d'un formatage printf, ou de boucles et de branches à usage général? Utilisez awk.
Inutile
la source
+1 sauf utilisation perlau lieu de awk. si vous avez besoin de quelque chose de plus compliqué que grep / cut / sed, alors les chances sont awk ne seront pas suffisantes et vous avez besoin de quelque chose de "complet"
sds
@sds pourquoi pas python à la place
RetroCode
@RetroCode: python est plus "à usage général" que perl; la doublure équivalente sera probablement beaucoup plus longue.
sds
3
@sds non, vous n'avez pas besoin de perl, sauf si vous allez faire autre chose que le traitement de texte. awk est très bien pour les trucs de traitement de texte qui sont plus compliqués que grep / cut / sed et en bonus vient en standard sur toutes les installations UNIX, contrairement à perl.
Ed Morton
10

Lorsque vous recherchez uniquement des chaînes et que la vitesse est importante, vous devez presque toujours l'utiliser grep. Ses ordres de grandeur sont plus rapides que awklorsqu'il s'agit de recherches grossières.

source Les différences fonctionnelles et de performances de sed, awk et d'autres utilitaires d'analyse 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
slm
la source
1
Merci pour cette belle vue d'ensemble de tous ces programmes. Cela fait vraiment la lumière dans l'obscurité.
holasz
1
~ headtilt ~ PHP est là mais Perl ne l'est pas?
Izkata
@Izkata - J'ai pensé la même chose quand j'ai vu ce tableau il y a quelque temps.
slm
1
Ce n'est pas vraiment juste pour les autres utils que grep cherche juste et qu'ils remplacent également.
Kevin
1
Ce sont des chiffres complètement faux. Parlez de comparer des pommes et des oranges - c'est comme dire que vous pouvez seulement trouver une nouvelle voiture sur le site web A 5 secondes alors que vous pouvez trouver une voiture, négocier un prix, obtenir un prêt, et acheter la voiture sur place B en 1 heure si par conséquent, le site A est plus rapide que le site B.L'article que vous avez cité est complètement faux dans ses déclarations de vitesse d'exécution relative entre grep, sed et awk et il dit également awk ... has PCRE matching for regular expressionsce qui est tout à fait faux.
Ed Morton
5

Bien que je convienne qu'en théorie grepdevrait être plus rapide que awk, dans la pratique, YMMV car cela dépend beaucoup de l'implémentation que vous utilisez.

comparant ici 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 

Dans l'environnement local C, seul GNU grep obtient un boost significatif et devient plus rapide que mawk.

L'ensemble de données, le type de l'expression rationnelle peut également faire une grande différence. Pour les regexps, awkil faut les comparer grep -Ecar awkles regexps sont des RE étendus.

Pour cet ensemble de données, awkpourrait être plus rapide que grepsur les systèmes basés sur busybox ou les systèmes où mawkest la valeur par défaut awket la locale par défaut est basée sur UTF-8 (IIRC, c'était le cas dans Ubuntu).

Stéphane Chazelas
la source
2

En un mot, grepne fait qu'une chose comme beaucoup d'autres outils UNIX et cela correspond à une ligne au modèle donné et il le fait bien. D'un autre côté, awkc'est un outil plus sophistiqué car il s'agit d'un langage de programmation complet défini par la norme POSIX avec des fonctionnalités typiques telles que des variables, des tableaux, des expressions, des fonctions ou des instructions de contrôle pour l'analyse et le traitement de modèles.

À mon avis, cela dépend de la mise en œuvre de la façon dont les deux outils fonctionnent en cas de correspondance de modèle et de la taille de certaines entrées que vous souhaitez traiter. Je m'attendrais à ce que grep soit 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 enregistrements correspondants, le calcul ou l'impression des résultats sans utiliser d'autres outils.

dsmsk80
la source