J'ai utilisé grep -i
plus souvent et j'ai découvert qu'il est plus lent que son egrep
équivalent, où je fais correspondre le caractère majuscule ou minuscule de chaque lettre:
$ time grep -iq "thats" testfile
real 0m0.041s
user 0m0.038s
sys 0m0.003s
$ time egrep -q "[tT][hH][aA][tT][sS]" testfile
real 0m0.010s
user 0m0.003s
sys 0m0.006s
Est grep -i
- ce que des tests supplémentaires egrep
ne le font pas?
grep
performance
tildearrow
la source
la source
grep
'inverse, pour vous assurer que vous ne mesurez pas la différence entre la mise en cache disque du fichier.egrep
c'est plus rapide quegrep
jusqu'à ce que je règleLANG=C
, puis les deux sont à peu près les mêmes.user
heure (qui n'inclut pas le temps d'attente pour le disque). Il y a un ordre de grandeur dans la différence.Réponses:
grep -i 'a'
est équivalent àgrep '[Aa]'
dans un environnement local uniquement ASCII. Dans les paramètres régionaux Unicode, les équivalences et les conversions de caractères peuvent être complexes. Ilgrep
peut donc être nécessaire d'effectuer un travail supplémentaire pour déterminer quels caractères sont équivalents. Le paramètre régional approprié estLC_CTYPE
: il détermine comment les octets sont interprétés en tant que caractères.D'après mon expérience, GNU
grep
peut être lent lorsqu'il est appelé dans un environnement local UTF-8. Si vous savez que vous recherchez uniquement des caractères ASCII, il peut être plus rapide de l'appeler dans des paramètres régionaux uniquement. J'attends celaproduirait des horaires impossibles à distinguer.
Cela étant dit, je ne peux pas reproduire votre résultat avec GNU
grep
sur Debian Jessie (mais vous n'avez pas spécifié votre fichier de test). Si je définis une locale ASCII (LC_ALL=C
),grep -i
est plus rapide. Les effets dépendent de la nature exacte de la chaîne. Par exemple, une chaîne contenant des caractères répétés réduit les performances ( ce qui est prévisible ).la source
-i
) insensibles à la casse ( ) avec des environnements locaux multi-octets aurait dû être améliorée dans 2.17 .grep -i 'a'
équivaut àgrep '[Aa]'
n'importe quel endroit Le bon exemple est celuigrep -i 'i'
qui estgrep '[Ii]'
ougrep '[İi]'
(majuscule I avec un point au-dessus, U + 130, langue turque). Cependant, il n'existe aucun moyen efficacegrep
de trouver cette classe d'équivalence en fonction des paramètres régionaux.Par curiosité, j'ai testé cela sur un système Arch Linux:
Et puis quelques statistiques de courtoisie de Y at-il un moyen d’obtenir le minimum, le maximum, la médiane et la moyenne d’une liste de nombres dans une seule commande? :
Je suis sur place
en_GB.utf8
, mais les temps sont presque indiscernables.la source