Comment compter toutes les correspondances d’une chaîne avec grep pour Linux
grep
est un utilitaire de recherche de texte qui peut fonctionner avec une entrée standard ou plusieurs fichiers à la fois. Il est utilisé pour imprimer des correspondances pour des modèles, des chaînes ou des expressions régulières. Il est souvent utile de pouvoir compter le nombre de matchs, ce qui grep
peut faire assez facilement.
Compter les correspondances avec grep
La grep
la commande a le -c
drapeau, qui comptera le nombre de lignes correspondantes et imprimera un nombre. Ceci est utile pour de nombreuses choses, telles que la recherche dans les fichiers journaux du nombre d’entrées à partir d’une adresse IP de particule, d’un point de terminaison ou d’un autre identifiant.
grep -c "1.2.3.4" /var/log/nginx/access.log
Cependant, grep
est capable de correspondre plusieurs fois par ligne. Si vous utilisez le -o
drapeau, grep
imprimera une nouvelle ligne par match. Cela ne fonctionne pas avec le -c
flag, car il ne comptera que les correspondances lignespas plusieurs correspondances par ligne.
Une meilleure solution consiste à utiliser le wc
(nombre de mots) avec l’utilitaire -l
paramètre (lignes), qui comptera le nombre brut de lignes qui lui sont transmises via l’entrée standard. Utilisant wc -l
est la solution préférée car elle fonctionne avec -o
pour compter le nombre d’occurrences de la chaîne ou du modèle donné dans l’ensemble du fichier.
grep -o "foo" file | wc -l
Comptage sur plusieurs fichiers
Une belle caractéristique de grep
est la capacité de gérer plusieurs fichiers à la fois, soit transmis xargs
, paramètres ou fournis avec une extension générique. Lors de la gestion de plusieurs fichiers, grep
imprimera le nom du fichier avant le match. Lors de l’utilisation -c
pour compter le nombre de lignes correspondantes, il imprimera également les noms de fichiers :
grep "foo" ./*.txt -cH
Vous devez toujours utiliser le -H
drapeau lorsque vous travaillez avec la possibilité de plusieurs fichiers, car il imprimera toujours le nom du fichier même s’il n’y a qu’un seul fichier passé à grep
. Cela empêchera l’automatisation de se casser si vous dépendez de la présence du nom de fichier.
Si vous voulez utiliser -o
pour compter plusieurs correspondances par ligne et transmettre la sortie à wc -l
vous aurez malheureusement la possibilité de voir les numéros pour chaque fichier individuel comme avec -c
. Cependant, avec un peu de script, vous pouvez couper la première colonne avec cut
et comptez le nombre d’occurrences uniques pour chaque nom de fichier avec uniq -c
:
grep "foo" ./*.txt -o | cut -d ':' -f 1 | uniq -c