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 Linux wc
commande vient de travailler avec d’autres commandes. Nous allons jeter un coup d’oeil.
Qu’est-ce que la commande wc ?
Le wc
La commande 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 ici que wc
commence vraiment à ajouter de la valeur.
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 que j’utilise wc
est comme un 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 du vrai et dangereux commandement.
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 wc
c’est-à-dire qu’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
consiste à passer le nom d’un fichier texte sur la ligne de commande.
wc lorem.txt
Ce qui provoque wc
pour 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 ».
cat lorem.txt
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
cat lorem2.txt
Ce temps, 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 tels.
On peut passer autant de fichiers à wc
comme on aime.
wc lorem.txt lorem2.txt
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 *.?
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 le -l
(lignes) -w
(mots) et -c
(octets) options.
wc lorem.txt
wc -l -w -c lorem.txt
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
Une attention particulière doit être portée au dernier chiffre, généré par le -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 ».
cat unicode.txt
Il comporte trois mots et un caractère alphabétique non latin. Eh bien laissez wc
traiter le fichier avec son paramètre par défaut d’octets, et nous le ferons à nouveau mais demander des caractères avec le -m
(caractères).
wc unicode.txt
wc -l -w -m unicode.txt
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. Le hexdump
commande -C
(canonique) 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
En ASCII, une valeur hexadécimale de 0x20
représente un espace. Si nous comptons trois valeurs à partir de la gauche, nous voyons que la valeur suivante est un espace. Donc, les trois premières valeurs 0x62
, 0x6f
et 0x79
représentent les lettres dans « garçon ».
En sautant par-dessus 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 ». Ceux-ci sont 0x64
, 0x5f
et 0x67
.
Juste derrière le mot « chien », on peut 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. Ceux-ci 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.
Prendre des noms de fichiers à partir d’un fichier
Il existe une autre façon 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 l’étrange « ^@
» les personnages qui less
utilise pour indiquer des octets nuls.
less source-files-list.txt
Pour utiliser le fichier avec wc
nous devons utiliser --files0-from
(lire l’entrée depuis) et transmettez le nom du fichier contenant les noms de fichiers.
wc ---files0-from=source-files-list.txt
Les fichiers sont traités exactement comme s’ils étaient fournis sur la ligne de commande.
Entrée de tuyauterie vers wc
Un moyen beaucoup plus courant, flexible et productif d’envoyer des données à wc
consiste à diriger la sortie d’autres commandes vers wc
. Nous pouvons le démontrer avec le echo
commande.
echo "Count this for me" | wc
echo -e "Count thisnfor me" | wc
La deuxième echo
commande utilise le -e
(caractères échappés) pour autoriser les séquences échappées telles que « n
” code de formatage de nouvelle ligne. Cela injecte une nouvelle ligne, provoquant wc
pour voir l’entrée sous forme de deux lignes.
Voici une cascade de commandes alimentant leur entrée de l’une à l’autre.
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq
- trouver recherche les fichiers (
type -f
) récursivement, en commençant dans le répertoire courant.rev
inverse les noms de fichiers. - couper 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. - tour inverse le premier champ extrait.
- trier les trie par ordre alphabétique croissant ordre.
- unique répertorie les entrées uniques dans la fenêtre du terminal.
Cette commande répertorie toutes les extensions de fichier uniques dans le répertoire actuel et tous les sous-répertoires.
Si nous ajoutions le -c
(compter) l’option uniq
commande, il compterait les occurrences de chaque type d’extension. Mais si nous voulons savoir combien d’extensions de fichiers uniques et différentes existent, nous pouvons supprimer wc
comme dernière commande sur la ligne, et utilisez le -l
(lignes).
find ./* -type f | rev | cut -d'.' -f1 | rev | sort | uniq | wc -l
Et enfin
Voici une dernière astuce 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
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 à intégrer dans les commandes canalisées lorsque vous devez compter toutes sortes de valeurs, pas seulement les mots d’un fichier.