3.2 Leçon 1
Certification : |
Linux Essentials |
---|---|
Version : |
1.6 |
Thème : |
3 La Puissance de la Ligne de Commande |
Objectif : |
3.2 Recherche et Extraction de Données dans des Fichiers |
Leçon : |
1 sur 2 |
Introduction
Dans cet atelier, nous nous concentrerons sur la redirection ou la transmission d’informations d’une source à une autre à l’aide d’outils spécifiques. La ligne de commande Linux redirige les informations par des canaux standard spécifiques. L’entrée standard (stdin ou canal 0) de la commande est considérée comme étant le clavier et la sortie standard (stdout ou canal 1) est considérée comme étant l’écran. Il existe également un autre canal qui est censé rediriger la sortie d’erreur (stderr ou canal 2) d’une commande ou les messages d’erreur d’un programme. L’entrée et/ou la sortie peuvent être redirigées.
Lors de l’exécution d’une commande, nous souhaitons parfois transmettre certaines informations à la commande ou rediriger la sortie vers un fichier spécifique. Chacune de ces fonctionnalités sera abordée dans les deux sections suivantes.
Redirection des E/S
La redirection E/S (Entrée/Sortie) permet à l’utilisateur de rediriger des informations depuis ou vers une commande en utilisant un fichier texte. Comme décrit précédemment, l’entrée, la sortie et la sortie d’erreur standard peuvent être redirigées, et les informations peuvent être extraites de fichiers texte.
Redirection de la Sortie Standard
Pour rediriger la sortie standard vers un fichier, au lieu de l’écran, nous devons utiliser l’opérateur >
suivi du nom du fichier. Si le fichier n’existe pas, un nouveau fichier sera créé, sinon, les informations écraseront le fichier existant.
Afin de voir le contenu du fichier que nous venons de créer, nous pouvons utiliser la commande cat
. Par défaut, cette commande affiche le contenu d’un fichier à l’écran. Consultez la page du manuel pour en savoir plus sur ses fonctionnalités.
L’exemple ci-dessous démontre la fonctionnalité de l’opérateur. Dans un premier temps, un nouveau fichier est créé contenant le texte “Hello World!”
$ echo "Hello World!" > text $ cat text Hello World!
Dans la seconde invocation, le même fichier est écrasé par le nouveau texte :
$ echo "Hello!" > text $ cat text Hello!
Si nous voulons ajouter de nouvelles informations à la fin du fichier, nous utiliserons l’opérateur >>
. Cet opérateur crée également un nouveau fichier s’il ne trouve pas un fichier existant.
Le premier exemple montre l’ajout du texte. Comme on peut le voir, le nouveau texte a été ajouté sur la ligne suivante :
$ echo "Hello to you too!" >> text $ cat text Hello! Hello to you too!
Le deuxième exemple montre qu’un nouveau fichier sera créé :
$ echo "Hello to you too!" >> text2 $ cat text2 Hello to you too!
Redirection de la Sortie d’Erreur Standard
Afin de rediriger uniquement les messages d’erreur, l’utilisateur devra utiliser l’opérateur 2>
suivi du nom du fichier dans lequel les erreurs seront écrites. Si le fichier n’existe pas, un nouveau fichier sera créé, sinon le fichier sera écrasé.
Comme expliqué, le canal pour rediriger l’erreur standard est le canal 2. Lors de la redirection de l’erreur standard, le canal doit être spécifié, contrairement à l’autre sortie standard où le canal 1 est défini par défaut. Par exemple, la commande suivante recherche un fichier ou un répertoire nommé games
et n’écrit que l’erreur dans le fichier text-error
, tout en affichant la sortie standard à l’écran :
$ find /usr games 2> text-error /usr /usr/share /usr/share/misc ---------Sortie Omise---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games $ cat text-error find: `games': No such file or directory
Note
|
Pour plus d’informations sur la commande |
Par exemple, la commande suivante s’exécutera sans erreur, donc aucune information ne sera écrite dans le fichier text-error
:
$ sort /etc/passwd 2> text-error $ cat text-error
De même que la sortie standard, l’erreur standard peut également être ajoutée à un fichier avec l’opérateur 2>>
. La nouvelle erreur sera ainsi ajoutée à la fin du fichier. Si le fichier n’existe pas, un nouveau fichier sera créé. Le premier exemple montre l’ajout de la nouvelle information dans le fichier, tandis que le second exemple montre que la commande crée un nouveau fichier lorsqu’un fichier existant ne peut être trouvé avec le même nom :
$ sort /etc 2>> text-error $ cat text-error sort: read failed: /etc: Is a directory
$ sort /etc/shadow 2>> text-error2 $ cat text-error2 sort: open failed: /etc/shadow: Permission denied
En utilisant ce type de redirection, seuls les messages d’erreur seront redirigés vers le fichier, la sortie normale sera écrite à l’écran ou passera par la sortie standard ou stdout.
Il existe un fichier particulier qui, techniquement, est un "bit bucket" (un fichier qui accepte des données et n’en fait rien) : /dev/null
. Vous pouvez rediriger toute information non pertinente que vous ne souhaitez pas voir affichée ou redirigée vers un fichier important, comme le montre l’exemple ci-dessous :
$ sort /etc 2> /dev/null
Redirection de l’Entrée Standard
Ce type de redirection est utilisé pour entrer des données dans une commande, à partir d’un fichier spécifié au lieu d’un clavier. Dans ce cas, l’opérateur <
est utilisé comme indiqué dans l’exemple :
$ cat < text Hello! Hello to you too!
La redirection de l’entrée standard est généralement utilisée avec les commandes qui n’acceptent pas les arguments de fichier. La commande tr
est l’une d’entre elles. Cette commande peut être utilisée pour traduire le contenu d’un fichier en modifiant les caractères d’un fichier de manière spécifique, comme en supprimant un caractère particulier d’un fichier, l’exemple ci-dessous montre la suppression du caractère l
:
$ tr -d "l" < text Heo! Heo to you too!
Pour plus d’informations, consultez la page man de tr
.
Here Documents (Ici documents)
Contrairement aux redirections de sortie, l’opérateur <<
agit de manière différente par rapport aux autres opérateurs. Ce flux d’entrée est également appelé here document. here document représente le bloc de code ou de texte qui peut être redirigé vers la commande ou le programme interactif. Différents types de langages de script, comme bash
, sh
et csh
, sont capables de prendre des données directement à partir de la ligne de commande, sans utiliser de fichiers texte.
Comme on peut le voir dans l’exemple ci-dessous, l’opérateur est utilisé pour entrer des données dans la commande, tandis que le mot après ne précise pas le nom du fichier. Le mot est interprété comme le délimiteur de l’entrée et il ne sera pas pris en considération comme contenu, donc cat
ne l’affichera pas :
$ cat << hello > hey > ola > hello hey ola
Consultez la page de manuel de la commande cat
pour plus d’informations.
Les Combinaisons
La première combinaison que nous allons explorer combine la redirection de la sortie standard et de la sortie d’erreur standard vers le même fichier. Les opérateurs &>
et &>>
sont utilisés, &
représentant la combinaison du canal 1 et du canal 2. Le premier opérateur écrasera le contenu existant du fichier et le second ajoutera les nouvelles informations à la fin du fichier. Les deux opérateurs permettront la création du nouveau fichier s’il n’existe pas, tout comme dans les sections précédentes :
$ find /usr admin &> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Sortie omise---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory $ find /etc/calendar &>> newfile $ cat newfile /usr /usr/share /usr/share/misc ---------Sortie omise---------- /usr/lib/libmagic.so.1.0.0 /usr/lib/libdns.so.81 /usr/games find: `admin': No such file or directory /etc/calendar /etc/calendar/default
Examinons un exemple utilisant la commande cut
:
$ cut -f 3 -d "/" newfile $ cat newfile share share share ---------Sortie omise---------- lib games find: `admin': No such file or directory calendar calendar find: `admin': No such file or directory
La commande cut
coupe des champs spécifiés du fichier d’entrée en utilisant l’option -f
, le 3ème champ dans notre cas. Pour que la commande puisse trouver le champ, un délimiteur doit également être spécifié avec l’option -d
. Dans notre cas, le délimiteur sera le caractère /
.
Pour en savoir plus sur la commande de cut
, consultez sa page man.
Les Pipes de la Ligne de Commande
La redirection est principalement utilisée pour stocker le résultat d’une commande, pour être traité par une commande différente. Ce type de processus intermédiaire peut devenir très fastidieux et compliqué si vous voulez que les données passent par plusieurs processus. Pour éviter cela, vous pouvez relier la commande directement par des pipes (tuyaux). En d’autres termes, la sortie de la première commande devient automatiquement l’entrée de la deuxième commande. Cette connexion se fait à l’aide de l’opérateur |
(barre verticale) :
$ cat /etc/passwd | less root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh :
Dans l’exemple ci-dessus, la commande less
après l’opérateur de pipe modifie la façon dont le fichier est affiché. La commande less
affiche le fichier texte, ce qui permet à l’utilisateur de faire défiler une ligne à la fois. less
est également utilisé par défaut pour afficher les pages de manuel, comme nous l’avons vu dans les leçons précédentes.
Il est possible d’utiliser plusieurs pipes en même temps. Les commandes intermédiaires qui reçoivent l’entrée puis la modifient et produisent la sortie sont appelées filtres. Prenons la commande ls -l
et essayons de compter le nombre de mots des 10 premières lignes de la sortie. Pour ce faire, nous devrons utiliser la commande head
qui, par défaut, affiche les 10 premières lignes d’un fichier, puis compter les mots à l’aide de la commande wc
:
$ ls -l | head | wc -w 10
Comme mentionné précédemment, par défaut, head
n’affiche que les 10 premières lignes du fichier texte spécifié. Ce comportement peut être modifié en utilisant des options spécifiques. Consultez la page de manuel de la commande pour en savoir plus.
Il existe une autre commande qui affiche la fin d’un fichier : tail
. Par défaut, cette commande sélectionne les 10 dernières lignes et les affiche, comme head
, ce nombre peut également être modifié. Consultez la page de manuel de tail
pour plus de détails.
Note
|
L’option |
La commande wc
(word count) compte par défaut les lignes, les mots et les octets d’un fichier. Comme le montre l’exercice, l’option -w
fait en sorte que la commande ne compte que les mots contenus dans les lignes sélectionnées. Les options les plus courantes que vous pouvez utiliser avec cette commande sont les suivantes : -l
, qui indique à la commande de ne compter que les lignes, et -c
, qui est utilisé pour ne compter que les octets. D’autres variantes et options de la commande, ainsi que de plus amples informations sur wc
peuvent être trouvées dans la page de man de la commande.
Exercices Guidés
-
Listez le contenu de votre répertoire courant, y compris la propriété et les autorisations, et redirigez la sortie vers un fichier nommé
contents.txt
dans votre répertoire personnel. -
Triez le contenu du fichier
contents.txt
de votre répertoire courant et ajoutez-le à la fin d’un nouveau fichier nommécontents-sorted.txt
. -
Affichez les 10 dernières lignes du fichier
/etc/passwd
et redirigez-les vers un nouveau fichier dans le répertoireDocuments
de votre utilisateur. -
Comptez le nombre de mots dans le fichier
contents.txt
et ajoutez la sortie à la fin d’un fichierfield2.txt
dans votre répertoire personnel. Vous devrez utiliser la redirection en entrée et en sortie. -
Affichez les 5 premières lignes du fichier
/etc/passwd
et triez la sortie par ordre alphabétique inverse. -
En utilisant le fichier
contents.txt
créé précédemment, comptez le nombre de caractères des 9 dernières lignes. -
Comptez le nombre de fichiers appelés
test
dans le répertoire/usr/share
et ses sous-répertoires. Note : chaque ligne de sortie de la commandefind
représente un fichier.
Exercices d’Exploration
-
Sélectionnez le deuxième champ du fichier
contents.txt
et redirigez la sortie standard et la sortie d’erreur vers un autre fichier appeléfield1.txt
. -
En utilisant l’opérateur de redirection d’entrée et la commande
tr
, supprimez les tirets (-
) du fichiercontents.txt
. -
Quel est le plus grand avantage de ne rediriger que les erreurs vers un fichier ?
-
Remplacez tous les espaces récurrents dans le fichier
contents.txt
, trié alphabétiquement, par un seul espace. -
Dans une ligne de commande, éliminez les espaces récurrents (comme vous l’avez fait dans l’exercice précédent), sélectionnez le neuvième champ et triez-le par ordre alphabétique inverse et sans tenir compte de la casse. Combien de pipes avez-vous dû utiliser ?
Résumé
Dans cet atelier, vous avez appris :
-
Les types de redirection
-
Comment utiliser les opérateurs de redirection
-
Comment utiliser les pipes pour filtrer les sorties des commandes
Commandes utilisées dans cette leçon :
cut
-
Supprime des sections de chaque ligne d’un fichier.
cat
-
Affiche ou concatène des fichiers.
find
-
Recherche de fichiers dans une hiérarchie de répertoires.
less
-
Affiche un fichier, ce qui permet à l’utilisateur de faire défiler une ligne à la fois.
more
-
Affiche un fichier, une page à la fois.
head
-
Affiche les 10 premières lignes d’un fichier.
tail
-
Affiche les 10 dernières lignes d’un fichier.
sort
-
Trie les fichiers.
wc
-
Compte par défaut les lignes, les mots ou les octets d’un fichier.
Réponses aux Exercices Guidés
-
Listez le contenu de votre répertoire courant, y compris la propriété et les autorisations, et redirigez la sortie vers un fichier appelé
contents.txt
dans votre répertoire personnel.$ ls -l > contents.txt
-
Triez le contenu du fichier
contents.txt
de votre répertoire courant et ajoutez-le à la fin d’un nouveau fichier nommécontents-sorted.txt
.$ sort contents.txt >> contents-sorted.txt
-
Affichez les 10 dernières lignes du fichier
/etc/passwd
et redirigez-les vers un nouveau fichier dans le répertoireDocuments
de votre utilisateur.$ tail /etc/passwd > Documents/newfile
-
Comptez le nombre de mots dans le fichier
contents.txt
et ajoutez la sortie à la fin d’un fichierfield2.txt
dans votre répertoire personnel. Vous devrez utiliser la redirection en entrée et en sortie.$ wc < contents.txt >> field2.txt
-
Affichez les 5 premières lignes du fichier
/etc/passwd
et triez la sortie par ordre alphabétique inverse.$ head -n 5 /etc/passwd | sort -r
-
En utilisant le fichier
contents.txt
créé précédemment, comptez le nombre de caractères des 9 dernières lignes.$ tail -n 9 contents.txt | wc -c 531
-
Comptez le nombre de fichiers appelés
test
dans le répertoire/usr/share
et ses sous-répertoires. Note : chaque ligne de sortie de la commandefind
représente un fichier.$ find /usr/share -name test | wc -l 125
Réponses aux Exercices d’Exploration
-
Sélectionnez le deuxième champ du fichier
contents.txt
et redirigez la sortie standard et la sortie d’erreur vers un autre fichier appeléfield1.txt
.$ cut -f 2 -d " " contents.txt &> field1.txt
-
En utilisant l’opérande de redirection d’entrée et la commande
tr
, supprimez les tirets (-
) du fichiercontents.txt
.$ tr -d "-" < contents.txt
-
Quel est le plus grand avantage de ne rediriger que les erreurs vers un fichier ?
Seul le fait de rediriger les erreurs vers un fichier peut aider à conserver un fichier journal qui est fréquemment surveillé.
-
Remplacez tous les espaces récurrents dans le fichier
contents.txt
, trié alphabétiquement, par un seul espace.$ sort contents.txt | tr -s " "
-
Dans une ligne de commande, éliminez les espaces récurrents (comme vous l’avez fait dans l’exercice précédent), sélectionnez le neuvième champ et triez-le par ordre alphabétique inverse et sans tenir compte de la casse. Combien de pipes avez-vous dû utiliser ?
$ cat contents.txt | tr -s " " | cut -f 9 -d " " | sort -fr
L’exercice utilise 3 pipes, un pour chaque filtre.