Linux / Commande wc : compter lignes, mots, caractères et octets
wc est une commande qui compte le nombre de lignes, de mots, d'octets et de caractères dans un fichier ou une entrée standard. Lorsqu'elle est exécutée sans options, elle affiche le nombre de nouvelles lignes, de mots et d'octets dans l'ordre, et vous pouvez choisir uniquement les valeurs dont vous avez besoin avec -l, -w, -c et -m.
Il est souvent utilisé non seulement pour des statistiques simples mais aussi pour vérifier le nombre d'entrées de journal, agréger les résultats de recherche, vérifier les fichiers de données et effectuer des jugements conditionnels dans les scripts shell. Cependant, vous devez être conscient que wc -l compte le nombre de caractères de nouvelle ligne, et non les lignes visibles à l'écran, et comprendre la différence entre -c et -m lors de leur utilisation.
Qu'est-ce que la commande wc ?
wc signifie word count (compte des mots), et il traite l’entrée pour compter les sauts de ligne, les mots, les octets et les caractères. Si aucun fichier n'est spécifié ou qu'un - est utilisé à la place d'un nom de fichier, il lit depuis l'entrée standard, ce qui permet de le connecter facilement à d'autres commandes via un pipe.
Dans GNU wc, un mot est une suite non vide de caractères délimitée par des espaces blancs, tels que l’espace, la tabulation et le saut de ligne selon la locale. Comme il ne détermine pas les mots grammaticaux ou les mots listés dans un dictionnaire, les chaînes avec des ponctuations attachées peuvent également être comptées comme un seul mot.
Syntaxe de base et lecture des résultats
La syntaxe de base est la suivante. Les crochets indiquent des éléments optionnels et ne doivent pas être inclus dans la commande réelle.
wc [options] [file...]
Les exemples utilisent Bash et GNU Coreutils. Vérifiez les options disponibles avec wc --help et la version avec wc --version. Pour reproduire le premier résultat sans modifier vos documents, préparez ce fichier dans un nouveau dossier temporaire :
wc_start=$PWD
wc_demo=$(mktemp -d) || exit 1
cd "$wc_demo" || exit 1
printf 'alpha beta\nsecond line\n' > notes.txt
Si vous spécifiez un seul fichier sans aucune option, le nombre de lignes, le nombre de mots, le nombre d'octets et le nom du fichier seront affichés.
wc notes.txt
2 4 23 notes.txt
Le résultat ci-dessus signifie que notes.txt contient 2 caractères de nouvelle ligne, 4 mots et 23 octets. L'espacement des champs de sortie peut varier en fonction de l'entrée, donc vous ne devez pas interpréter le résultat en fonction du nombre d'espaces.
Pour voir seulement la valeur dont vous avez besoin, spécifiez l'option correspondante.
wc -l notes.txt
wc -w notes.txt
wc -c notes.txt
Principales options de wc
| Option | Cible du calcul | Points à noter |
|---|---|---|
-l, --lines |
Nombre de caractères de nouvelle ligne | Si la dernière ligne n'a pas de nouvelle ligne, cette ligne n'est pas incluse |
-w, --words |
Nombre de mots séparés par des espaces | La détermination des espaces peut être affectée par la locale |
-c, --bytes |
Nombre d'octets | Un caractère multioctet peut avoir plusieurs octets par caractère |
-m, --chars |
Nombre de caractères | Affecté par la locale actuelle et le codage des caractères |
-L, --max-line-length |
Largeur à l'écran de la ligne la plus longue | Pas seulement un simple comptage de caractères ; les tabulations et les caractères larges sont également pris en compte |
--files0-from=file |
Une liste de fichiers séparés par des caractères NUL | Option d'extension GNU, utile pour gérer les noms de fichiers avec des caractères spéciaux |
Vous pouvez également spécifier plusieurs options ensemble. L'ordre de sortie n'est pas déterminé par l'ordre des options, mais par le nombre de lignes, de mots, de caractères, d'octets et la longueur maximale des lignes. Pour la définition exacte et les options d'extension GNU, vous pouvez vous référer à la documentation officielle de GNU Coreutils wc.
Comment compter précisément le nombre de lignes
wc -l compte les caractères de nouvelle ligne
wc -l affiche le nombre de caractères de nouvelle ligne dans l'entrée, et non le nombre logique de lignes. Pour un fichier texte typique, chaque ligne se termine par une nouvelle ligne, donc le résultat correspond au nombre de lignes, mais si la dernière ligne ne contient pas de nouvelle ligne, il peut être inférieur d'une unité par rapport aux lignes visibles.
wc -l access.log
Vous pouvez vérifier si un fichier texte se termine par un saut de ligne en inspectant le dernier octet de cette manière. Si le résultat est 0a, il se termine par un caractère LF (Line Feed).
tail -c 1 notes.txt | od -An -t x1
Un essai sans fichier montre la différence : la première commande suivante affiche 1, la seconde 2.
printf 'one\ntwo' | wc -l
printf 'one\ntwo\n' | wc -l
Afficher uniquement les nombres sans le nom du fichier
Si vous passez un fichier en argument, le nom du fichier apparaîtra après le résultat. Si vous voulez stocker uniquement les nombres dans une variable shell, utilisez la redirection de l'entrée standard.
line_count=$(wc -l < notes.txt)
printf '%s\n' "$line_count"
GNU wc affiche les valeurs sans espaces initiaux lors de l'impression d'une seule valeur, mais si le script prend également en compte d'autres implémentations, il est plus sûr de vérifier séparément le format du nombre.
Différence entre le nombre d'octets et le nombre de caractères
-c compte les octets
wc -c compte le nombre d'octets dans l'entrée. Il convient pour vérifier la taille d'un fichier en octets ou calculer la taille réelle des données à transférer.
wc -c document.txt
Pour obtenir directement la taille logique rapportée dans les métadonnées d’un fichier ordinaire, utilisez stat. Cela ne signifie pas que wc -c lit toujours tous ses octets : GNU wc peut aussi optimiser ce comptage, comme le montre son code source officiel.
stat -c '%s' document.txt
-m compte les caractères selon la locale
wc -m compte les caractères en fonction de la locale et de l'encodage actuels. En UTF-8, un caractère ASCII est de 1 octet, tandis qu'un caractère non-ASCII peut utiliser plusieurs octets, donc les résultats de -c et -m peuvent différer pour le même fichier.
printf 'Linux café\n' | wc -c
printf 'Linux café\n' | wc -m
Dans une locale UTF-8 compatible avec ce texte, les deux commandes ci-dessus affichent respectivement 12 octets et 11 caractères, saut de ligne compris. Vérifiez l’encodage actif avec locale charmap. -m ne compte pas les graphèmes, c’est-à-dire les groupes visuels perçus comme un seul caractère : une lettre suivie d’un accent combinant ou certains emoji peuvent compter pour plusieurs caractères.
Dans les fichiers avec des encodages incorrects mélangés, le nombre de caractères peut différer des attentes. Si l'objectif est un traitement basé sur les caractères, vérifiez l'environnement actuel avec locale et faites le correspondre avec l'encodage du fichier.
Comment le nombre de mots est-il calculé ?
wc -w compte le nombre de chaînes non vides séparées par des espaces. Les espaces ou tabulations consécutifs agissent comme des délimiteurs, et il ne supprime pas la ponctuation ni n'analyse la morphologie de la langue.
printf 'one two\tthree\n' | wc -w
3
wc ne réalise pas une analyse linguistique ni le comptage des jetons d’un modèle de langage. Utilisez un analyseur ou un tokenizer adapté si c’est le résultat recherché.
Vérification des comptes et totaux pour plusieurs fichiers
Résultats par fichier et la ligne totale
Les fichiers nommés dans les autres exemples (access.log, document.txt, data.csv ou le dossier logs) doivent exister ; adaptez ces noms à vos données. Le résultat illustratif ci-dessous suppose que les trois journaux contiennent respectivement 120, 135 et 98 fins de ligne.
Lorsque plusieurs fichiers sont spécifiés, une ligne total affichant la somme globale est ajoutée après les résultats de chaque fichier.
wc -l january.log february.log march.log
120 january.log
135 february.log
98 march.log
353 total
Spécification de la méthode d'affichage du total avec l'option GNU --total
Les versions de GNU wc qui proposent l’option --total permettent de contrôler l'affichage de la ligne totale avec --total=auto, always, only ou never. Si seul le nombre total est nécessaire, il peut être utilisé comme suit.
wc -l --total=only january.log february.log march.log
Si wc --help ne mentionne pas --total, conservez la forme précédente sans cette option : pour plusieurs fichiers, le total reste affiché sur la dernière ligne. Vérifiez la disponibilité avant de copier une commande comportant cette extension dans un script.
--total est une extension GNU et peut ne pas être disponible dans les anciennes versions de Coreutils ou d'autres environnements de type Unix. Si la portabilité est nécessaire, vérifiez le support en utilisant wc --help et utilisez une méthode pour gérer la dernière ligne de la sortie existante.
Exemples pratiques utilisant des pipes
Comptage des lignes de résultats de recherche
Vous pouvez compter le nombre de lignes correspondantes en passant les résultats de grep à wc -l.
grep 'ERROR' app.log | wc -l
Si vous avez seulement besoin du nombre de lignes correspondantes dans un seul fichier, grep -c 'ERROR' app.log est plus direct. Les deux méthodes comptent chaque ligne une seule fois, même si le motif apparaît plusieurs fois dans cette ligne. Pour des méthodes de recherche détaillées, référez-vous à Utilisation de la commande grep sur Linux.
Vérification du nombre de lignes dans des données CSV
Si la première ligne d'un fichier CSV contient les noms des colonnes, vous pouvez ignorer l'en-tête en utilisant tail -n +2 puis compter les lignes de données.
tail -n +2 data.csv | wc -l
Pour les fichiers où des sauts de ligne réels sont autorisés à l'intérieur des champs CSV, un seul enregistrement peut occuper plusieurs lignes physiques, donc vous ne pouvez pas compter avec précision le nombre d'enregistrements de cette manière. Ces fichiers doivent être traités avec un analyseur CSV. Vous pouvez vérifier la méthode pour spécifier la plage dans tail à Comment utiliser la commande Linux tail.
Compter les noms de fichiers en toute sécurité même avec des caractères spéciaux
La sortie normale de find peut compter de manière incorrecte le nombre d'éléments si les noms de fichiers contiennent des caractères de saut de ligne. Dans un environnement GNU, vous pouvez séparer les noms de fichiers avec un caractère NUL puis compter le nombre de NUL.
find ./logs -type f -name '*.log' -print0 | LC_ALL=C tr -cd '\0' | wc -c
C'est plus sûr pour les noms de fichiers contenant des espaces et des sauts de ligne que d'utiliser simplement find... | wc -l. Le motif de recherche *.log doit être mis entre guillemets afin que le shell ne l'expanse pas d'abord.
Vérification du nombre de processus en cours d'exécution
Si GNU/Linux ps prend en charge --no-headers, vous pouvez compter les lignes de la liste des processus en excluant l'en-tête.
ps -e --no-headers | wc -l
C'est un instantané au moment où la commande est exécutée, et les résultats peuvent varier selon si les propres processus du pipeline sont inclus ou l'implémentation de ps. Lors de son utilisation comme métrique de surveillance, envisagez d'utiliser des outils dédiés ou une méthode de collecte basée sur /proc.
Vérification de la longueur de la ligne la plus longue
wc -L calcule la largeur maximale affichée à l'écran, et non le simple nombre d'octets ou de caractères de la ligne la plus longue. GNU wc prend en compte les caractères larges en fonction de la locale actuelle et calcule les tabulations en unités de 8.
wc -L table.txt
Par conséquent, vous ne devez pas supposer que le résultat de -L est le même que la longueur en caractères obtenue avec awk '{ print length }' ou le nombre d'octets provenant de wc -c. Pour les tâches nécessitant un comptage exact de caractères, telles que les vérifications de style de code, vous devez d'abord vérifier la définition de longueur utilisée par l'outil.
Avec plusieurs fichiers, wc -L donne un maximum global dans la ligne de total, et non la somme des largeurs maximales.
Manipulation sécurisée de nombreux fichiers
Éviter les limites de longueur de ligne de commande
Lorsque le nombre de fichiers est très élevé, l'expansion des caractères génériques par le shell peut dépasser la limite de longueur de la ligne de commande. L'option --files0-from=- de GNU wc lit une liste de fichiers séparés par des NUL depuis l'entrée standard pour éviter ce problème.
find ./logs -type f -name '*.log' -print0 | wc -l --files0-from=-
Cette commande affiche le nombre de lignes dans chaque fichier journal et le total général. La liste d’entrée reste non ambiguë grâce aux délimiteurs NUL. La sortie par fichier contient toutefois encore des noms et des retours à la ligne : ne la découpez pas naïvement pour un traitement automatique. Si seul le total est nécessaire et que la version le permet, ajoutez --total=only.
Faites attention aux totaux divisés par xargs
find... | xargs wc -l peut être divisé en plusieurs exécutions de wc lorsqu'il y a beaucoup de fichiers. Dans ce cas, chaque exécution génère un total séparé, ce qui rend difficile la lecture du total général directement. Dans un environnement GNU, --files0-from=- est mieux adapté pour agréger toute la liste en une seule fois.
Principes d'utilisation dans les scripts shell
Demandez uniquement la valeur dont vous avez besoin
Ne divisez pas les colonnes multiples de la sortie wc sans options par des espaces ; demandez plutôt uniquement la valeur nécessaire avec -l, -w ou -c. Si le nom de fichier n'est pas nécessaire non plus, utilisez la redirection d'entrée.
bytes=$(wc -c < archive.dat)
Distinguez entre les erreurs et 0
Le résultat 0 pour un fichier vide et une erreur due à l'échec de la lecture du fichier ont des significations différentes. Si vous ne stockez que la valeur, vous pourriez manquer l'erreur standard ou le code de sortie, donc dans l'automatisation importante, vérifiez aussi si la commande a réussi.
if count=$(wc -l < input.txt); then
printf 'lines=%s\n' "$count"
else
printf 'Could not read input.txt.\n' >&2
false
fi
La branche d’échec se termine ici par false pour donner un statut non nul au bloc, sans quitter votre shell interactif. Dans un pipeline tel que grep | wc -l, le statut final vient habituellement de la dernière commande : il faut aussi traiter les erreurs en amont, par exemple avec l’option Bash pipefail lorsque ce comportement convient au script.
Malentendus courants et précautions
Le résultat de wc -l est inférieur d'un à ce qui était attendu
Il est probable que la dernière ligne ne se termine pas par un caractère de saut de ligne. wc -l compte les caractères de saut de ligne, donc il n'inclut pas la dernière ligne incomplète. Avant de modifier arbitrairement le format original, vérifiez les règles de sortie du programme qui a généré le fichier.
-c et -m diffèrent pour les caractères multioctets
-c compte les octets, tandis que -m compte les caractères. Cette différence est normale dans les encodages multi-octets comme UTF-8. Si le but est la taille de stockage, utilisez -c ; si le but est le nombre de caractères décodés selon la locale, vérifiez l'encodage et la locale, puis utilisez -m.
Puis-je compter le nombre de fichiers avec la sortie de ls ?
Pour des noms de fichiers normaux, ls | wc -l peut sembler simple, mais il n'est pas adapté à l'automatisation en raison des alias, des formats de sortie et des noms de fichiers contenant des retours à la ligne. Utilisez find pour spécifier les types de fichiers et la profondeur de recherche, et si vous manipulez des noms de fichiers arbitraires, choisissez la méthode séparée par NUL.
Questions fréquemment posées
Que se passe-t-il si vous exécutez wc sans options ?
Par défaut, le nombre de lignes, de mots et d'octets est affiché dans cet ordre. Si vous spécifiez un fichier en argument, le nom du fichier sera également affiché à la fin.
Quel est le résultat de wc pour un fichier vide ?
Un fichier vide sans contenu a 0 pour les lignes, les mots et les octets. Un fichier contenant un seul LF affiche 1 avec wc -l et contient un octet. Une fin de ligne CRLF contient deux octets, mais toujours un seul LF.
wc -w compte-t-il les mots avec précision dans toutes les langues ?
wc -w compte les chaînes séparées par des espaces blancs ; il n'effectue pas de segmentation des mots en fonction de la langue. Traitez le résultat comme un décompte délimité par des espaces blancs plutôt que comme un décompte linguistique des mots.
Puis-je compter le nombre de lignes dans un répertoire lui-même ?
wc n'est pas une commande pour compter directement les entrées d'un répertoire. Vous devez créer la liste des fichiers que vous souhaitez en utilisant des commandes comme find, puis agréger les résultats. S'il peut y avoir des caractères spéciaux dans les noms de fichiers, utilisez des caractères NUL comme séparateurs au lieu des sauts de ligne.
Après les essais, revenez au répertoire initial avec cd "$wc_start". Vérifiez le chemin conservé dans wc_demo, puis supprimez uniquement les fichiers d’essai créés et leur dossier si vous n’en avez plus besoin.
Résumé
Le nombre de lignes peut être vérifié avec wc -l, le nombre de mots avec wc -w, le nombre d'octets avec wc -c, et le nombre de caractères avec wc -m. La sortie sans options montre les lignes, les mots et les octets dans l'ordre, et si plusieurs fichiers sont spécifiés, les valeurs pour chaque fichier et la somme totale sont affichées.
Pour des résultats précis, rappelez-vous que wc -l compte les caractères de nouvelle ligne, que les octets et les caractères peuvent différer, et qu'un délimiteur NUL peut être nécessaire pour la liste des noms de fichiers. Pour consulter d'autres outils de base ensemble, vous pouvez vous référer à une liste de commandes couramment utilisées sous Linux.




