TP #4 : Enchainement d'instructions
Responsables : Jean-Patrick Gelas, Nicolas Louvet
Version : 0.1a (04/2021)
Objectif : Nous allons voir comment des instructions peuvent s'enchainer et ainsi tirer partie les unes des autres.
L'opérateur pipe
Parfois nommé tube en français, l'opérateur |
nous permet d'envoyer le
résultat d'une commande normalement affiché à l'écran vers l'entrée d'une autre
commande. Autrement dit, le pipe (|
) permet de rediriger la sortie
standard (stdout) d'une commande vers l'entrée standard (stdin) d'une
autre commande.
Dans l'exemple suivant la première instruction cat liste.txt
permet
normalement d'afficher à l'écran le contenu du fichier liste.txt, mais
puisque nous avons utilisé un pipe (|
), l'affichage est redirigé vers l'entrée de la
commande grep
qui a ici pour paramètre la chaine de caractères 2012 a filtrer (cf. TP#3).
$ cat file.txt | grep "2012"
Remarque : Notez que le résultat de la commande ci-dessus sera le même que la
commande grep "2012" file.txt
.
La commande sort
Afin de nous exercer et comprendre tout l'intérêt du pipe nous allons utiliser la commande sort
.
Cette commande permet par exemple de trier des lignes de texte contenu dans un
fichier dans l'ordre alphabétique.
Soit le fichier suivant nommé randomNames.txt
qui contient une liste de
noms aléatoire a raison de un par ligne.
Prof
Atchoum
Dormeur
Grincheux
Joyeux
Timide
Simplet
Pour trier ces noms nous pourrions utiliser la commande suivante
$ cat randomNames.txt | sort
Question 1 : Remarquez que le résultat de la commande ci-dessus s'affiche
seulement à l'écran dans votre console. Le fichier randomNames.txt
n'est en
rien modifié. Compléter la commande ci-dessus afin de sauvegarder le résulat
dans le fichier nommé sortedNames.txt
(Hints: Utilisez une redirection).
Soit le fichier suivant nommé randomNumbers.txt
qui contient une liste de
nombres a raison de un par ligne.
23
1
42
10
321
112
Pour trier ces nombres nous pourrions utiliser les commandes suivantes
$ cat randomNumbers.txt | sort
Question 2 : Observez le résultat de cette commande. Oui il y a de quoi être
déçu. Que constatez-vous et comment y remédier ? (Hints: la réponse est dans
la page de manuel de la commande sort
).
La commande wc
La commande wc
permet de compter le nombre de lignes, de mots et de caractères contenu dans un fichier.
Avec l'option -l
on obtient uniquement le nombre de ligne (cf. man wc
).
Voici un exemple sur un fichier qui contiendrait 6 lignes.
$ wc -l liste.txt
6 liste.txt
Question 3 : Proposez un enchainement de commandes qui permet de compter le
nombre de lignes du fichier randomNames.txt
contenant la lettre x
, ou
autrement dit : Combien de noms dans cette liste utilise la lettre x
?
Les opérateurs &&
et ||
Notez tout d'abord que ces deux opérateurs n'ont respectivement rien à voir
avec le simple &
(utilisé pour lancer une commande en tâche de fond (background
process), et le simple |
(utilisé pour transmettre la sortie d'une commande
vers l'entrée de la commande suivante).
Les opérateurs &&
et ||
servent a enchainer l'exécution de commandes en
fonction de la valeur de retour de la commande située à gauche.
Voici quelques exemples relativement parlant.
$ unecommandequisepassebienetquisetermineparunexit0.sh && echo "Everything is fine"
Everything is fine # la commande echo a été exécutée
$ unecommandequisortavecunexitdifferentdezero.sh || echo "Bad thing happen"
Bad thing happen # la commande echo à été exécutée
Utilisez les commandes true
et false
pour tester facilement les opérateurs &&
et ||
.
$ true # la commande true retourne systématiquement 0
$ echo $?
0
$ false # la commande false retourne systématiquement 1
$ echo $?
1
$ true && echo "Ce texte s'affiche"
Ce texte s'affiche
$ false || echo "Ce texte s'affiche aussi"
Ce texte s'affiche aussi
$ true || echo "Ne s'affichera pas"
$ false && echo "Ne s'afficher pas"
Question 4 : Pour chacune des propositions suivante notez si le message final s'affiche ou pas.
$ true && true && true && echo "Congratulations, you made it."
$ false || false || false || echo "It's really bad luck."
$ true && false || echo "Who knows?"
Les caractères génériques *
et ?
Le caractére *
est un caractère dit générique. Il remplace n'importe quelle
chaine de caractéres constitué de 0, 1 ou plusieurs caractères.
Par exemple la commande :
ls *.c
affichera l'ensemble des fichiers, situés dans votre répertoire courant et dont l'extension est.c
.mv *me.txt /tmp
déplacera dans le répertoire /tmp tous les fichiers dont le nom termine parme.txt
(ex: readme.txt, programme.txt, me.txt, pomme.txt,...)cp hello.* backup/
copie dans un répertoire backup tous les fichiers commencant parhello.
(ex: hello.c, hello.java, hello.py, hello.sh, hello.txt.gz)
Le caractére ?
est également un caractère générique, mais qui se substitue à seul et unique caractère.
Par exemple la commande :
ls file??.txt
affichera les fichiers file01.txt, file02.txt mais n'affichera pas file1.txt.mv ?iologie.txt /tmp
déplacera dans /tmp les fichiers biologie.txt, Biologie.txt mais pas les fichiers radiologie.txt ou cardiologie.txt
La commande find
La commande find
est une commande très puissante qui permet, comme son nom
l'indique, de trouver des fichiers dans votre système de fichiers. On peut la
paramétrer avec des critères de recherche trés précis. Par exemple :
- Trouve moi tous les fichiers dont l'extension est
.jpg
,.png
ou.gif
et qui se trouve dans le répertoire/home/bob/work
. - Trouve moi tous les fichiers dont la taille est supérieure à 1Go dans mon systéme de fichiers.
- Trouve moi tous les fichiers ayant été créé ou modifié ces derniéres 24h.
- etc.
La commande qui suit permet de trouver tous les fichiers ayant l'extension .avi
contenu dans les dossiers de Bob.
$ find /home/bob -iname "*.avi"
/home/bob/video/lucifer-S1E1.avi
/home/bob/education/hentai-nsfw-2021.avi
/home/bob/tuto/video/java-for-beginners.avi
...
Question 5 : Quel est l'intérêt d'utiliser l'option -iname
plutôt que -name
?
Activités
Activité 1 : Donner la ligne de commandes qui permet d'obtenir la liste de tous vos fichiers source de développement logiciel (.cpp, .sh et .java) dans votre compte.
Activité 2 : Donner la ligne de commandes qui compte le nombre de fichiers ayant l'extension .sh
Activité 3 : Soit la commande ps aux
. Complétez la ligne de commandes ci-dessous qui permet d'afficher ce processus sans le grep
afficher à l'écran.
$ ps aux | grep 'ps aux' | ...
Félicitation ! Vous avez terminé le TP #4.