Pour capturer un motif particulier, awk
et grep
peut ê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.
linux
awk
grep
performance
holasz
la source
la source
time
commande pour chronométrer le temps qu'il faut pour exécuter la commande. Ex:time ls -l
.Réponses:
grep sera très probablement plus rapide:
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.
la source
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 source
perl
au lieu deawk
. 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"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 queawk
lorsqu'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
la source
awk ... has PCRE matching for regular expressions
ce qui est tout à fait faux.Bien que je convienne qu'en théorie
grep
devrait être plus rapide queawk
, 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.
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,
awk
il faut les comparergrep -E
carawk
les regexps sont des RE étendus.Pour cet ensemble de données,
awk
pourrait être plus rapide quegrep
sur les systèmes basés sur busybox ou les systèmes oùmawk
est la valeur par défautawk
et la locale par défaut est basée sur UTF-8 (IIRC, c'était le cas dans Ubuntu).la source
En un mot,
grep
ne 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é,awk
c'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.
la source