Exercices pratiques pour réviser et maîtriser les fondamentaux du shell Unix (bash) : navigation, gestion des fichiers, recherche et traitement de texte.
Manipuler fichiers et répertoires en ligne de commande
Rechercher et filtrer des données avec grep
Extraire et transformer du texte avec cut, tr, sed
Composer des pipelines pour traiter des données
Créer des scripts shell simples pour automatiser vos tâches
Message de bienvenue
Les blocs grisés comme celui-ci contiennent des commandes Shell (bash). Vous pouvez les exécuter directement dans un terminal pour tester les commandes expliquées dans ce TP.
echo"Bienvenue dans le TP Shell Unix : Maîtrise des fondamentaux !"echo"Durée : 3 heures | Format : Explication → Illustration → Pratique"
Bienvenue dans le TP Shell Unix : Maîtrise des fondamentaux !
Durée : 3 heures | Format : Explication → Illustration → Pratique
find, pushd/popd, alias ll='ls -lah', fonctions shell
Fichiers
mkdir -p {a,b}, cp -a, rsync -av, rename
Compétence
Outils et techniques
Navigation
fzf, fd, zoxide, CDPATH, symbolic links
Fichiers
find -exec, rsync --exclude, inotifywait, scripts
Introduction et navigation
Qu’est-ce qu’un shell ?
Le shell est un interpréteur de commandes qui permet d’interagir avec le système. Les shells les plus courants sont :
bash (Bourne Again Shell) - le plus répandu
zsh (Z Shell) - par défaut sur macOS récents
sh (Bourne Shell) - le shell historique
Différence Terminal vs Shell :
Le terminal est l’interface graphique (fenêtre) où vous tapez des commandes
Le shell est le programme qui interprète vos commandes
Pourquoi le shell pour un informaticien ?
Interactivité : exécution rapide de commandes
Automatisation : scripts pour tâches répétitives
Serveurs de calcul : HPC, clusters sans interface graphique
Pipelines de données : prétraitement avant analyse
Reproductibilité : traçabilité et versionnage des opérations (y compris dans des conteneurs type docker)
Anatomie d’une commande
Une commande shell se compose généralement d’un verbe (la commande), d’options (modificateurs) et d’arguments (cibles).
commande-options arguments
Exemple : ls -lah /home
ls : la commande (lister)
-lah : options
-: format court des options (-l, -a, -h) avec possibilité de les combiner
--all --human-readable -l : format long des options
/home : argument (chemin)
Commandes de navigation essentielles
Commande
Description
Exemple
pwd
Print Working Directory - affiche le répertoire courant
pwd
ls
List - liste le contenu d’un répertoire
ls -la
cd
Change Directory - change de répertoire
cd /tmp
Chemins absolus vs relatifs
Le système de fichiers est organisé en une arborescence avec la racine /.
Les fichiers peuvent être des répertoires ou des fichiers ordinaires.
Les répertoires peuvent contenir d’autres répertoires (sous-répertoires).
Chaque utilisateur a un répertoire personnel, souvent /home/username.
Un chemin Absolu : commence par / → /home/user/documents
Un chemin Relatif : par rapport au répertoire courant → ../data ou ./script.sh
. : répertoire courant
.. : répertoire parent
~ : raccourci vers votre répertoire personnel
Illustration
Tester les commandes de navigation de base :
pwd
/home/jovyan/work/assignments/shell_tp
ls-lah
total 0
drwxr-xr-x. 1 jovyan jovyan 16 Feb 2 10:32 .
drwxr-xr-x. 1 jovyan jovyan 106 Feb 2 10:32 ..
-rw-r--r--. 1 jovyan jovyan 0 Feb 2 10:32 test.txt
Plusieurs commandes de shell peuvent être combinées sur une seule ligne en les séparant par des && (exécute la commande suivante seulement si la précédente réussit) ou des ; (exécute toutes les commandes successivement) ou par des || (exécute la commande suivante seulement si la précédente échoue).
cd /tmp &&pwd
/tmp
cd ~ &&pwd
/home/jovyan
Note🎯 Exercice : Navigation et exploration
Objectif : Créer une arborescence de projet et s’y déplacer
Créer l’arborescence suivante :
projet/
├── data/
├── scripts/
└── results/
Se déplacer dans data/ et créer 3 fichiers vides
Lister le contenu de projet/ depuis data/sans changer de répertoire
Revenir à votre répertoire personnel en une seule commande
Questions de réflexion :
Quelle différence y a-t-il entre cd .. et cd ../.. ?
Pourquoi utiliser mkdir -p plutôt que mkdir simple ?
man mkdir, la commande man affiche le manuel d’une commande.
#| code-fold: true#| code-summary: "Solution"mkdir-p projet/{data,scripts,results}cd projet/datatouch file1.txt file2.txt file3.txtecho"Contenu de projet/ depuis data/ :"ls ..cd ~
Contenu de projet/ depuis data/ :
data results scripts
il est aussi possible de créer l’arborescence en une seule commande { et }, permettant de grouper des parties communes.
Manipulation de fichiers
Le shell offre de nombreuses commandes pour manipuler fichiers et répertoires.
Commandes de manipulation essentielles
Commande
Description
Exemple
touch
Créer un fichier vide, modifier la date
touch fichier.txt
mkdir
Créer un répertoire
mkdir dossier
cp
Copier fichiers/répertoires
cp source destination
mv
Déplacer/renommer
mv ancien nouveau
rm
Supprimer
rm fichier.txt
Options importantes
-r : récursif (pour les répertoires)
-f : force (pas de confirmation)
-v : verbose (affiche les opérations)
-i : interactif (demande confirmation)
-p : parents (crée les répertoires intermédiaires)
⚠️ ATTENTION :rm supprime définitivement les fichiers ! Toujours vérifier avant.
Illustration
# Créer un répertoiremkdir test_dir# Créer des fichiers ou changer leur date à maintenanttouch file1.txt file2.txt# Lister le contenuls-l
total 0
-rw-r--r--. 1 jovyan jovyan 0 Feb 2 10:32 file1.txt
-rw-r--r--. 1 jovyan jovyan 0 Feb 2 10:32 file2.txt
drwxr-xr-x. 1 jovyan jovyan 36 Feb 2 10:32 projet
drwxr-xr-x. 1 jovyan jovyan 0 Feb 2 10:32 test_dir
-rw-r--r--. 1 jovyan jovyan 0 Feb 2 10:32 test.txt
# Copier un fichiercp file1.txt file1_backup.txt# Déplacer un fichiermv file2.txt test_dir/# Lister le contenu récursivementls-R# Lister sous forme d'arborescencetree .
Il existe plusieurs commandes pour afficher le contenu d’un fichier texte dans le terminal.
Commandes de visualisation
Commande
Usage
Quand l’utiliser
cat
Affiche tout le contenu
Petits fichiers
less
Navigation interactive
Gros fichiers
head
Premières lignes
Aperçu rapide
tail
Dernières lignes
Logs, suivi
wc
Compte lignes/mots/caractères
Statistiques
Redirections
En shell, les flux d’entrée/sortie sont des concepts clés :
stdin (0) : entrée standard (clavier par défaut)
stdout (1) : sortie standard (écran par défaut)
stderr (2) : sortie d’erreur (écran par défaut)
Les redirections permettent de rediriger ces flux vers des fichiers ou d’autres commandes.
Opérateur
Action
Exemple
>
Écraser le fichier
echo "texte" > file.txt
>>
Ajouter à la fin
echo "suite" >> file.txt
<
Entrée depuis fichier
wc -l < file.txt
2>
Rediriger erreurs
commande 2> errors.log
Parcours
[Minimal] : Lire fichier, redirection simple > et >>
[Approfondi] : head, tail -f, redirections < et 2>
[Avancé] : Combiner pipes et redirections pour traiter gros fichiers
Illustration
# Créer un fichier texteecho"Ligne 1"> fichier.txt# Ajouter des lignesecho"Ligne 2">> fichier.txtecho"Ligne 3">> fichier.txt# Afficher le contenucat fichier.txt
Ligne 1
Ligne 2
Ligne 3
Le shell propose aussi des boucles comme for. La forme basique est :
for variable in liste;docommandesdone
On peut utiliser cette boucle pour créer plusieurs lignes dans un fichier :
for i in{1..10};doecho"Ligne $i">> demo.txt;done#Afficher les 3 premières ligneshead-n 3 demo.txt#Afficher les 3 dernières lignestail-n 3 demo.txt
Ligne 1
Ligne 2
Ligne 3
Ligne 8
Ligne 9
Ligne 10
# Compter le nombre de lignes d'un fichierwc-l< demo.txt
10
Note🎯 Exercice : Création de données**
Objectif : Manipuler fichiers texte et redirections
Créer un fichier notes.txt contenant les notes de 15 étudiants (nom, note) au format EtudiantX,note (X de 1 à 15, note de 15.5).
Afficher les 3 premières lignes de notes.txt
Ajouter 5 nouvelles notes pour des étudiants supplémentaires (16 à 20) avec une note de 16.0
Compter le nombre total de lignes dans notes.txt et enregistrer le résultat dans stats.txt
Solution
for i in{1..15};doecho"Etudiant$i,15.5">> notes.txt;donehead-n 3 notes.txtfor i in{16..20};doecho"Etudiant$i,16.0">> notes.txt;donewc-l notes.txt > stats.txtcat stats.txt
En plus des commandes internes au shell, Unix propose des outils puissants pour rechercher et filtrer du texte. Les fichiers sont traités comme des flux de texte (ligne par ligne), ce qui permet d’appliquer des commandes de recherche et de filtrage.
grep - Rechercher des motifs
La commande grep (Global Regular Expression Print) permet de rechercher des lignes correspondant à un motif donné. Le motif peut être une chaîne simple ou une expression régulière.
grep"motif" fichier.txt
La syntaxe de base des expressions régulières et des extensions courantes :
Caractères et classes
. : correspond à n’importe quel caractère (sauf saut de ligne par défaut)
[abc] : l’un des caractères a ou b ou c
[a-z] : intervalle (ici toute lettre minuscule)
[^0-9] : négation — tout caractère sauf chiffres
\d, \w, \s : digit, word, space (selon moteur : PCRE/grep -P)
Quantificateurs
* : 0 ou plus
+ : 1 ou plus
? : 0 ou 1
{m}, {m,}, {m,n} : répétitions exactes / au moins / intervalle
quantificateurs « paresseux » *?, +?, {m,n}? (PCRE) pour minimiser la correspondance
Groupes, références et alternatives
(expr) : groupe capturant — permet \1, \2 en remplacements
(?:expr) : groupe non capturant (pas de backreference)
a|b : alternative (a ou b)
Ancres et assertions
^ : début de ligne
$ : fin de ligne
\b : bord de mot (word boundary)
Lookaround (assertions sans consommer les caractères) — PCRE / grep -P / perl:
Date ISO (YYYY-MM-DD) : ^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
Illustration
La commande cat > app.log << 'EOF' crée (ou écrase) le fichier app.log et y écrit le texte jusqu’à la ligne contenant uniquement EOF.
‘EOF’ dans l’exemple ci-dessous est une convention pour indiquer la fin du texte à insérer dans le fichier. Tout ce qui est entre << 'EOF' et EOF sera écrit dans le fichier app.log. Cela s’appelle une redirection de type “here document”.
# Créer un fichier de log exemplecat> app.log << 'EOF'INFO: Application démarréeERROR: Connexion échouéeWARNING: Mémoire faibleINFO: Traitement en coursERROR: Fichier introuvableDEBUG: Variable x = 10INFO: Database connectéeEOF
INFO: Application démarrée
ERROR: Connexion échouée
WARNING: Mémoire faible
INFO: Traitement en cours
ERROR: Fichier introuvable
DEBUG: Variable x = 10
INFO: Database connectée
ERROR: Connexion échouée
ERROR: Fichier introuvable
1
INFO: Application démarrée
ERROR: Connexion échouée
WARNING: Mémoire faible
INFO: Traitement en cours
ERROR: Fichier introuvable
INFO: Database connectée
Note🎯 Exercice : Recherche basique**
Objectif : Utiliser grep pour analyser un fichier de log 1. Afficher toutes les lignes contenant “ERROR” dans app.log 2. Compter le nombre de lignes contenant “WARNING” (insensible à la casse) 3. Afficher toutes les lignes ne contenant pas “INFO” 4. Afficher les lignes contenant “database” avec leur numéro de ligne (insensible à la casse)
cut permet d’extraire des colonnes de fichiers structurés.
Parcours
[Minimal] : cut -d’,’ -f1
[Approfondi] : cut plusieurs colonnes, caractères
[Avancé] : combiner cut avec grep et pipes pour extraction conditionnelle
Illustration et pratique
cat> etudiants.csv << 'EOF'nom,prenom,noteDupont,Jean,15Martin,Marie,17Bernard,Luc,12EOFecho"Champs nom,prenom,note dans etudiants.csv :"cut-d','-f1,3 etudiants.csvecho"Premiers 6 caractères de chaque ligne :"cut-c1-6 etudiants.csv
Champs nom,prenom,note dans etudiants.csv :
nom,note
Dupont,15
Martin,17
Bernard,12
Premiers 6 caractères de chaque ligne :
nom,pr
Dupont
Martin
Bernar
Note🎯 Exercice : Extraction de colonnes
Objectif : Utiliser cut pour extraire des données spécifiques
Dans le fichier etudiants.csv précedemment créé, effectuer les extractions demandées :
Extraire uniquement les notes des étudiants
Extraire les noms et prenoms des étudiants
Solution
echo"Extraire uniquement les notes :"cut-d','-f3 etudiants.csvecho"Extraire les noms et prénoms :"cut-d','-f1,2 etudiants.csv
Extraire uniquement les notes :
note
15
17
12
Extraire les noms et prénoms :
nom,prenom
Dupont,Jean
Martin,Marie
Bernard,Luc
3.2 Transformation avec tr
tr (translate) permet de transformer des caractères dans un flux texte.
[Avancé] : pipelines pour nettoyage de gros fichiers
tr lit depuis l’entrée standard et écrit sur la sortie standard. On peut donc l’utiliser en combinaison avec des redirections ou des pipes ().
Note🎯 Exercice : Nettoyage de données**
Dans la chaine de caractères suivante, effectuer les transformations demandées :
echo" Alice; Bob; Charlie123; David "> raw_data.txt
Remplacer ; par ,
Convertir minuscules en majuscules
Supprimer les chiffres
Compresser les espaces multiples en un seul espace
Solution
echo"Remplacer ';' par ',' :"tr';'','< raw_data.txtecho"Remplacer les minuscules par des majuscules :"tr'a-z''A-Z'< raw_data.txtecho"Supprimer les chiffres :"tr-d'0-9'< raw_data.txtecho"Compresser les espaces multiples en un seul espace :"tr-s' '< raw_data.txt
Remplacer ';' par ',' :
Alice, Bob, Charlie123, David
Remplacer les minuscules par des majuscules :
ALICE; BOB; CHARLIE123; DAVID
Supprimer les chiffres :
Alice; Bob; Charlie; David
Compresser les espaces multiples en un seul espace :
Alice; Bob; Charlie123; David
Édition avec sed
La commande sed (stream editor) permet de faire des substitutions et transformations avancées sur des flux texte. Elle peut agit comme uen editeur de texte en ligne de commande.
La syntaxe de base pour une substitution est :
sed's/motif/remplacement/options' fichier.txt
[Minimal] : substitution simple, suppression de ligne : s/ancien/nouveau/, sed '/motif/d'
En utilisant sed et/ou tr, réaliser les opérations suivantes :
Remplacer ; par ,
Masquer les ID produits (ex: 001 → XXX)
Convertir les prix en euros (ex: 999.99 → 999,99 €)
Solution
# Remplacer les points par des virgules dans les prixtr';'','< products.txt# Masquer les ID produitssed's/^[0-9]\{3\}/XXX/' products.txt# convertir les prix sans unité en eurossed's/\([0-9]\+\)\.\([0-9]\+\)/\1,\2 €/' products.txt
La commande awk est un langage de traitement de texte puissant pour des transformations plus complexes basées sur des motifs et des champs. Cependant, son apprentissage dépasse le cadre de ce TP.
BLOC 4 : Pipelines et composition
Parcours pédagogiques — Bloc 4 : Pipelines et composition
Sous unix les droits d’accès aux fichiers et répertoires sont gérés via un système de permissions.
Chaque fichier/répertoire a des permissions pour trois catégories d’utilisateurs :
Propriétaire (user)
Groupe (group)
Autres (others)
Les permissions possibles sont :
Lecture (r)
Écriture (w)
Exécution (x) - pour les fichiers, permet d’exécuter un script ou un programme ; pour les répertoires, permet d’accéder au contenu.
Les permissions sont affichées avec la commande ls -l :
-rwxr-xr-- 1 user group 1234 Jan 31 12:00 script.shdrwxr-xr-- 1 user group 4096 Jan 31 12:00 mon_dossier
Les trois premiers caractères rwx sont les permissions du propriétaire, les trois suivants r-x celles du groupe, et les trois derniers r-- celles des autres. Le premier caractère indique le type (fichier, répertoire, lien).
Il est possible de modifier les permissions avec la commande chmod (change mode). Soit en notation symbolique :
chmod u+x script.sh # ajoute la permission d'exécution pour le propriétairechmod u+x script.sh # ajoute la permission d'exécution pour le propriétairechmod g-w mon_dossier # retire la permission d'écriture pour le groupe
Il est aussi possible d’utiliser la notation numérique dans laquelle chaque groupe permission (rwx) est vue comme une valeur binaire de 3 bits qui peut être convertie en un chiffre octal (0-7 : r=4, w=2, x=1) :
Les processus sont des programmes en cours d’exécution. Chaque processus a un PID (Process IDentifier) unique. Il a aussi des informations associées comme l’utilisateur, l’état, l’utilisation CPU/mémoire. Une processus peut être en avant-plan (foreground) ou en arrière-plan (background). En avant -plan, il bloque le terminal jusqu’à sa fin. En arrière-plan, il permet de continuer à utiliser le terminal. Lorsque le terminal est fermé, les processus en avant-plan sont terminés. Ceux en arrière-plan s’arrêtent aussi sauf s’ils sont détachés (avec nohup ou disown ou les outils screen ou tmux).
Les commandes utiles pour gérer les processus sont : | Commande | Description | Exemple | | ——– | ——————————- | —————— | | ps | Affiche les processus en cours | ps aux | top | Affiche les processus en temps réel | top | | kill | Termine un processus par son PID | kill 1234 | & | Lance un processus en arrière-plan | ./script.sh & | jobs | Liste les processus en arrière-plan | jobs |
[Minimal] : chmod +x, ls -l
[Approfondi] : notation numérique, processus ps, top
[Avancé] : scripts lancés en background, gestion erreurs
5.2 Variables et scripting
Cette partie n’est pas exhaustive mais donne les bases pour commencer à écrire des scripts shell.
Le shell permet de créer des scripts pour automatiser des tâches répétitives. Un script est un fichier texte executable contenant une série de commandes shell. Un script commence généralement par une ligne shebang (#!/bin/bash) pour indiquer quel interpréteur utiliser.
Les variables en shell sont créées sans déclaration préalable. On les assigne avec = sans espaces. Pour accéder à la valeur d’une variable, on utilise le préfixe $. On peut aussi utiliser les accolades {} pour délimiter le nom de la variable. Les variables sont typiquement des chaînes de caractères utilisées dans les commandes.
En shell, les guillemets simples (') préservent la valeur littérale, tandis que les guillemets doubles (") permettent l’expansion des variables.
Les scripts peuvent accepter des arguments positionnels, accessibles via $1, $2, etc. Le nombre total d’arguments est dans $#, et tous les arguments dans $@.
# Exemple de script simplecat> hello.sh << 'EOF'#!/bin/bash# Script de salutationNAME=$1echo "Bonjour, $NAME !"echo 'Exemple avec guillemets simples : $NAME'EOFchmod +x hello.sh
Pour qu’une variable soit accessible dans les sous-processus, elle doit être exportée avec export. La commande source ou . permet d’exécuter un script dans le contexte actuel du shell, important pour charger des variables d’environnement.
Un exemple plus complet :
cat> sum.sh << 'EOF'#!/bin/bash# Script pour afficher le maximum des paramètres# Le shell offre des structures de contrôle comme les conditions et les boucles.if [ $# -eq 0 ]; then echo "Usage: $0 nombre1 nombre2 ..." exit 1fiMAX=$1for NUM in "$@"; do if [ "$NUM" -gt "$MAX" ]; then MAX=$NUM fidoneecho "Le maximum est : $MAX"export MAXEOFMAX=0echo"Variable MAX avant source : $MAX"chmod +x sum.sh./sum.sh 10 25 7 42 3echo"Variable MAX sans source : $MAX"source sum.sh 10 25 7 42 3echo"Variable MAX après source : $MAX"
Variable MAX avant source : 0
Le maximum est : 42
Variable MAX sans source : 0
Le maximum est : 42
Variable MAX après source : 42
[Minimal] : variables simples, echo
[Approfondi] : arguments, boucles
[Avancé] : scripts robustes avec vérification d’arguments, find, wc