Comment utiliser la commande wc sous Linux

Publié: 2022-07-23
Ordinateur portable Linux affichant une invite bash
fatmawati achmad zaenuri/Shutterstock.com

Compter le nombre de lignes, de mots et d'octets dans un fichier est utile, mais la véritable flexibilité de la commande Linux wc vient du travail avec d'autres commandes. Nous allons jeter un coup d'oeil.

Qu'est-ce que la commande wc ?

La commande wc est une petite application. C'est l'un des principaux utilitaires Linux, il n'est donc pas nécessaire de l'installer. Il sera déjà sur votre ordinateur Linux.

Vous pouvez décrire ce qu'il fait en très peu de mots. Il compte les lignes, les mots et les octets d'un fichier ou d'une sélection de fichiers et imprime le résultat dans une fenêtre de terminal. Il peut également tirer son entrée du flux STDIN, ce qui signifie que le texte que vous souhaitez qu'il traite peut y être acheminé. C'est là que wc commence vraiment à ajouter de la valeur.

Comment utiliser les tubes sous Linux
CONNEXION Comment utiliser les tuyaux sous Linux

C'est un excellent exemple du mantra Linux de "faire une chose et bien la faire". Parce qu'il accepte les entrées canalisées, il peut être utilisé dans des incantations multi-commandes. Comme nous le verrons, ce petit utilitaire autonome est en fait un excellent joueur d'équipe.

Une façon d'utiliser wc est comme espace réservé dans une commande compliquée ou un alias que je prépare. Si la commande terminée a le potentiel d'être destructrice et de supprimer des fichiers, j'utilise souvent wc comme remplaçant de la commande réelle et dangereuse.

De cette façon, pendant le développement de la commande, j'obtiens un retour visuel indiquant que chaque fichier est traité comme prévu. Il n'y a aucune chance que quelque chose de mal se produise pendant que je lutte avec la syntaxe.

Aussi simple que soit wc , il y a encore quelques petites bizarreries que vous devez connaître.

Premiers pas avec wc

La façon la plus simple d'utiliser wc est de passer le nom d'un fichier texte sur la ligne de commande.

 wc lorem.txt 

Utilisation de wc avec un fichier contenant une longue ligne de texte

Cela amène wc à analyser le fichier et à compter les lignes, les mots et les octets, et à les écrire dans la fenêtre du terminal.

Les mots sont considérés comme tout ce qui est délimité par des espaces. Qu'il s'agisse de mots d'une langue réelle ou non n'a aucune importance. Si un fichier ne contient que « frd g lkj », il compte toujours comme trois mots.

Les lignes sont des séquences de caractères terminées soit par un retour chariot soit par la fin du fichier. Peu importe si la ligne revient dans votre éditeur ou dans la fenêtre du terminal, jusqu'à ce que wc rencontre un retour chariot ou la fin du fichier, c'est toujours la même ligne.

Notre premier exemple a trouvé une ligne dans tout le fichier. Voici le contenu du fichier « lorem.txt ».

 chat lorem.txt 

Le contenu du fichier avec une longue ligne

Tout cela compte comme une seule ligne car il n'y a pas de retour chariot. Comparez cela à un autre fichier, "lorem2.txt", et comment wc l'interprète.

 wc lorem2.txt
 chat lorem2.txt 

Utiliser wc avec un fichier contenant plusieurs lignes

Cette fois, wc compte 15 lignes car des retours chariot ont été insérés dans le texte pour commencer une nouvelle ligne à des points spécifiques. Cependant, si vous comptez les lignes contenant du texte, vous verrez qu'il n'y en a que 12.

Les trois autres lignes sont des lignes vides à la fin du fichier. Ceux-ci ne contiennent que des retours chariot. Même s'il n'y a pas de texte dans ces lignes, une nouvelle ligne a été commencée et donc wc les compte comme telles.

Nous pouvons transmettre autant de fichiers à wc que nous le souhaitons.

 wc lorem.txt lorem2.txt 

Utiliser wc avec deux fichiers

Nous obtenons les statistiques pour chaque dossier individuel et un total pour tous les dossiers.

Nous pouvons également utiliser des caractères génériques afin de pouvoir sélectionner des fichiers correspondants au lieu de fichiers explicitement nommés.

 wc *.txt *.? 

Utiliser wc avec des jokers

Les options de la ligne de commande

Par défaut, wc affichera les lignes, les mots et les octets de chaque fichier. C'est la même chose que d'utiliser les options -l (lignes) -w (mots) et -c (octets).

 wc lorem.txt
 wc -l -w -c lorem.txt 

Utilisation de wc avec les options lignes, mots et octets

Nous pouvons spécifier quelle combinaison de chiffres nous souhaitons voir.

 wc -l lorem.txt

wc -w lorem.txt

wc -c lorem.txt

wc -l -c lorem.txt 

Utilisation de wc avec combinaisons d'options

Une attention particulière doit être portée au dernier chiffre, généré par l'option -c (octets). Beaucoup de gens confondent cela avec le fait de compter les caractères. Il compte en fait des octets . Le nombre de caractères et le nombre d'octets pourraient bien être les mêmes. Mais pas toujours.

Examinons le contenu d'un fichier appelé "unicode.txt".

 chat unicode.txt 

Le contenu d'un fichier contenant un caractère non latin

Il comporte trois mots et un caractère alphabétique non latin. Nous laisserons wc traiter le fichier avec son paramètre par défaut de bytes , et nous le ferons à nouveau mais demanderons des caractères avec l'option -m (caractères).

 wc unicode.txt
 wc -l -w -m unicode.txt 

Compter les octets dans un fichier puis compter les caractères dans le même fichier

Il y a plus d'octets que de caractères.

Jetons un coup d'œil au vidage hexadécimal du fichier et voyons ce qui se passe. L'option -C (canonique) de la commande hexdump affiche les octets du fichier en lignes de 16, avec leur équivalent ASCII simple (s'il y en a un) affiché à la fin de la ligne. S'il n'y a pas de caractère ASCII correspondant, un point " . ” s'affiche à la place.

 hexdump -C unicode.txt 

Un vidage hexadécimal d'un fichier court avec un caractère non latin

En ASCII, une valeur hexadécimale de 0x20 représente un caractère espace. Si nous comptons trois valeurs à partir de la gauche, nous voyons que la valeur suivante est un espace. Ainsi, ces trois premières valeurs 0x62 , 0x6f et 0x79 représentent les lettres dans "boy".

En sautant par-dessus le 0x20 , nous voyons un autre ensemble de trois valeurs hexadécimales : 0x63 , 0x61 et 0x74 . Ceux-ci épellent "chat". En sautant sur le caractère d'espace suivant, nous voyons trois autres valeurs pour les lettres dans "chien". Ce sont 0x64 , 0x5f et 0x67 .

Juste derrière le mot "chien", nous pouvons voir un espace 0x20 et cinq autres valeurs hexadécimales. Les deux derniers sont des retours chariot, 0x0a .

Les trois autres octets représentent le caractère non latin, que nous avons entouré de vert. C'est un caractère Unicode, et il faut trois octets pour l'encoder. Ce sont 0xe1 , 0xaf et 0x8a .

Assurez-vous donc de savoir ce que vous comptez et que les octets et les caractères ne doivent pas nécessairement être les mêmes. Habituellement, le comptage des octets est plus utile car il vous indique ce qui se trouve réellement à l' intérieur du fichier. Le comptage par caractères vous donne le nombre de choses représentées par le contenu du fichier.

CONNEXION: Que sont les codages de caractères comme ANSI et Unicode, et en quoi diffèrent-ils?

Prendre des noms de fichiers à partir d'un fichier

Il existe un autre moyen de fournir des noms de fichiers à wc . Vous pouvez mettre les noms de fichiers dans un fichier et transmettre le nom de ce fichier à wc . Il ouvre le fichier, extrait les noms de fichiers et les traite comme s'ils avaient été passés sur la ligne de commande. Cela vous permet de stocker une collection arbitraire de noms de fichiers pour les réutiliser.

Mais il y a un piège, et c'est un gros problème. Les noms de fichiers doivent se terminer par un caractère nul et non par un retour chariot . Autrement dit, après chaque nom de fichier, il doit y avoir un octet nul de 0x00 au lieu de l'octet de retour chariot habituel 0x0a .

Vous ne pouvez pas ouvrir un éditeur et créer un fichier avec ce format. Généralement, des fichiers comme celui-ci sont générés par d'autres programmes. Mais, si vous avez un tel fichier, voici comment vous l'utiliserez.

Voici notre fichier contenant les noms de fichiers. L'ouvrir en less vous montre les étranges caractères « ^@ » que less utilise pour indiquer les octets nuls.

 moins source-files-list.txt 

Un fichier en moins qui contient des octets nuls

Pour utiliser le fichier avec wc , nous devons utiliser --files0-from (lire l'entrée depuis) ​​et transmettre le nom du fichier contenant les noms de fichiers.

 wc ---files0-from=source-files-list.txt 

wc traitant le fichier de noms de fichiers terminés par null

Les fichiers sont traités exactement comme s'ils étaient fournis sur la ligne de commande.

Entrée de tuyauterie vers wc

Une manière beaucoup plus courante, flexible et productive d'envoyer des entrées à wc consiste à diriger la sortie d'autres commandes vers wc . Nous pouvons le démontrer avec la commande echo .

 echo "Compte ça pour moi" | toilettes
 echo -e "Comptez ceci\npour moi" | toilettes 

Utiliser echo pour envoyer une entrée à wc

La deuxième commande echo utilise l'option -e (caractères échappés) pour autoriser les séquences échappées comme le code de formatage de nouvelle ligne « \n ». Cela injecte une nouvelle ligne, ce qui fait que wc voit l'entrée comme deux lignes.

Voici une cascade de commandes alimentant leur entrée de l'une à l'autre.

 trouver ./* -type f | tour | couper -d'.' -f1 | tour | trier | unique
  • find recherche les fichiers ( type -f ) de manière récursive, en commençant par le répertoire courant. rev inverse les noms de fichiers.
  • cut extrait le premier champ ( -f1 ) en définissant le délimiteur de champ comme étant un point « . " et la lecture depuis le "devant" du nom de fichier inversé jusqu'au premier point qu'il trouve. Nous avons maintenant extrait l'extension de fichier.
  • rev inverse le premier champ extrait.
  • sort les trie par ordre alphabétique croissant.
  • uniq répertorie les entrées uniques dans la fenêtre du terminal.

La liste des extensions uniques dans l'arborescence de répertoires actuelle

Cette commande répertorie toutes les extensions de fichier uniques dans le répertoire actuel et tous les sous-répertoires.

Si nous ajoutions l'option -c (count) à la commande uniq , cela compterait les occurrences de chaque type d'extension. Mais si nous voulons savoir combien d'extensions de fichiers différentes et uniques il y a, nous pouvons supprimer wc comme dernière commande sur la ligne et utiliser l'option -l (lines).

 trouver ./* -type f | tour | couper -d'.' -f1 | tour | trier | unique | wc -l 

Ajout de wc pour compter les extensions uniques

CONNEXION: Comment utiliser la commande Linux cut

Et enfin

Voici une dernière astuce que wc peut faire pour vous. Il vous indiquera la longueur de la ligne la plus longue d'un fichier. Malheureusement, il ne vous dit pas de quelle ligne il s'agit. Cela vous donne juste la longueur.

 wc -L taf.c 

Obtenir la longueur de la ligne la plus longue dans un fichier avec wc

Attention cependant, les tabulations comptent pour huit espaces. Vu dans mon éditeur, il y a trois onglets à deux espaces au début de cette ligne. Sa longueur réelle est de 124 caractères. Le chiffre rapporté est donc artificiellement élargi.

Je traiterais cette fonction avec une grosse pincée de sel. Et par là, je veux dire ne pas l'utiliser. Sa sortie est trompeuse.

Malgré ses bizarreries, wc est un excellent outil à utiliser dans les commandes canalisées lorsque vous devez compter toutes sortes de valeurs, pas seulement les mots d'un fichier.

CONNEXION: 37 commandes Linux importantes que vous devez connaître