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 par me.txt (ex: readme.txt, programme.txt, me.txt, pomme.txt,...)
  • cp hello.* backup/ copie dans un répertoire backup tous les fichiers commencant par hello. (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.