Bienvenue dans ce module où tu vas apprendre les commandes Bash essentielles pour manipuler des fichiers, automatiser des tâches, et interagir avec ton environnement système — des compétences indispensables pour un Data Engineer !
Prérequis
Niveau
Compétence
✅ Requis
Avoir suivi le module 01_intro_data_engineering
✅ Requis
Avoir accès à un terminal (Linux, Mac, ou Windows avec WSL/Git Bash)
Objectifs du module
À la fin de ce module, tu seras capable de :
Naviguer dans l’arborescence de fichiers
Manipuler des fichiers et dossiers
Filtrer et rechercher dans des données
Écrire des scripts Bash pour automatiser des tâches
Planifier des jobs avec cron
C’est quoi le langage Bash ?
Bash (abréviation de Bourne Again SHell) est un langage de commande et de script utilisé dans la majorité des systèmes Unix/Linux (et même sous Windows via WSL ou Git Bash).
Il te permet de :
Naviguer dans les dossiers
Manipuler des fichiers et des données
Automatiser des tâches répétitives
Écrire des scripts shell pour lancer des traitements de données
Extraction automatique de données chaque nuit à 2h
Manipuler des fichiers
Fusionner 100 fichiers CSV en un seul
Orchestrer des outils
Lancer Docker, Spark, ou Airflow depuis un script
Analyser des logs
Trouver toutes les erreurs dans les logs du jour
💡 En bref : le Bash est ton couteau suisse pour parler avec ton ordinateur et piloter l’écosystème data.
ℹ️ Le savais-tu ?
Le mot Bash signifie “Bourne Again SHell”, un jeu de mots sur :
Le shell Unix original : le Bourne Shell (sh), développé dans les années 1970 par Stephen Bourne
L’expression anglaise “born again” = renaître
Bash est donc une nouvelle version améliorée du shell Bourne, libre, puissante, et utilisée par défaut dans la plupart des systèmes Unix/Linux modernes.
Installe WSL (Windows Subsystem for Linux) ou Git Bash
Installation de WSL sur Windows
# Dans PowerShell en administrateurwsl --install
Après redémarrage, tu auras accès à un terminal Linux complet !
Vérifier ta version de Bash
bash--version
1. Navigation & exploration
Les commandes de base pour se déplacer dans l’arborescence :
Voir le code
%%bash# Affiche le chemin du dossier courant (Print Working Directory)pwd# Liste les fichiers du dossier courantls# Liste avec détails (permissions, taille, date)ls-lh# Liste incluant les fichiers cachésls-la# Affiche l'arborescence (si installé)# tree# Change de dossiercd /tmppwd# Revenir au dossier précédentcd-# Aller au dossier homecd ~
Raccourcis de navigation essentiels
Symbole
Signification
Exemple
.
Dossier courant
./script.sh
..
Dossier parent
cd ..
~
Dossier home
cd ~
/
Racine du système
cd /
-
Dossier précédent
cd -
2. Création et manipulation de fichiers
Créer, copier, déplacer, supprimer :
Voir le code
%%bash# Créer un dossiermkdir data# Créer un dossier avec ses parents (pas d'erreur si existe)mkdir-p data/raw/2024# Créer un fichier videtouch data/fichier.csv# Créer plusieurs fichierstouch data/file1.csv data/file2.csv data/file3.csv# Copier un fichiercp data/fichier.csv data/fichier_backup.csv# Copier un dossier entier (récursif)cp-r data/ data_backup/# Déplacer / Renommer un fichiermv data/fichier.csv data/nouveau_nom.csv# Supprimer un fichierrm data/file1.csv# Supprimer un dossier vidermdir data/raw/2024# Supprimer un dossier et son contenu (⚠️ DANGEREUX)rm-r data_backup/
%%bash# Affiche le contenu entierecho"=== cat ==="cat ventes.csvecho""echo"=== head (3 premières lignes) ==="head-n 3 ventes.csvecho""echo"=== tail (2 dernières lignes) ==="tail-n 2 ventes.csvecho""echo"=== wc (comptage) ==="wc-l ventes.csv # Nombre de ligneswc-w ventes.csv # Nombre de motswc-c ventes.csv # Nombre de caractères
Lire des gros fichiers avec less
Pour les fichiers volumineux, utilise less qui permet de naviguer :
less gros_fichier.csv
Touche
Action
↓ ou j
Ligne suivante
↑ ou k
Ligne précédente
Space
Page suivante
b
Page précédente
/mot
Rechercher “mot”
n
Occurrence suivante
q
Quitter
4. Recherche & filtrage
Extraire des informations précises — essentiel pour un Data Engineer !
Voir le code
%%bashecho"=== grep : recherche de motifs ==="# Rechercher les lignes contenant "Laptop"echo"Lignes avec 'Laptop':"grep"Laptop" ventes.csvecho""# Recherche insensible à la casseecho"Recherche insensible à la casse (-i):"grep-i"laptop" ventes.csvecho""# Compter le nombre de correspondancesecho"Nombre de lignes avec 'Souris':"grep-c"Souris" ventes.csvecho""# Afficher les numéros de ligneecho"Avec numéros de ligne (-n):"grep-n"99.99" ventes.csvecho""# Inverser la recherche (lignes qui NE contiennent PAS)echo"Lignes SANS 'Laptop' (-v):"grep-v"Laptop" ventes.csv
Voir le code
%%bashecho"=== find : trouver des fichiers ==="# Créer quelques fichiers pour l'exemplemkdir-p projet/data projet/scriptstouch projet/data/users.csv projet/data/sales.csv projet/data/old.jsontouch projet/scripts/etl.py projet/scripts/utils.py# Trouver tous les fichiers .csvecho"Fichiers .csv:"find projet/ -name"*.csv"echo""# Trouver tous les fichiers .pyecho"Fichiers .py:"find projet/ -name"*.py"echo""# Trouver les fichiers modifiés dans les dernières 24hecho"Fichiers modifiés récemment:"find projet/ -mtime-1-type f# Nettoyagerm-r projet/
Voir le code
%%bashecho"=== cut : extraire des colonnes ==="# Extraire la 2ème colonne (produit)echo"Colonne 'produit':"cut-d','-f2 ventes.csvecho""echo"=== sort : trier ==="# Trier par produit (2ème colonne)echo"Trié par produit:"tail-n +2 ventes.csv |sort-t','-k2echo""echo"=== uniq : valeurs uniques ==="# Liste des produits uniquesecho"Produits uniques:"cut-d','-f2 ventes.csv |tail-n +2 |sort|uniqecho""# Compter les occurrencesecho"Comptage par produit:"cut-d','-f2 ventes.csv |tail-n +2 |sort|uniq-c
5. Pipes & redirections
Le pipe (|) est l’outil le plus puissant de Bash : il permet de chaîner des commandes en envoyant la sortie d’une commande vers l’entrée de la suivante.
Voir le code
%%bashecho"=== Exemples de pipes ==="# Trouver les ventes de Laptop et compterecho"Nombre de ventes Laptop:"cat ventes.csv |grep"Laptop"|wc-lecho""# Top 3 des produits les plus vendusecho"Top 3 produits (par nombre de lignes):"cut-d','-f2 ventes.csv |tail-n +2 |sort|uniq-c|sort-rn|head-3echo""# Pipeline complexe : produits avec prix > 100echo"Produits avec prix > 100:"tail-n +2 ventes.csv |awk-F',''$4 > 100 {print $2, $4}'|sort-u
Voir le code
%%bashecho"=== Redirections ==="# Rediriger vers un fichier (écrase)grep"Laptop" ventes.csv > laptops.txtecho"Contenu de laptops.txt:"cat laptops.txtecho""# Ajouter à un fichier (append)grep"Écran" ventes.csv >> laptops.txtecho"Après ajout:"cat laptops.txtecho""# Rediriger les erreursls fichier_inexistant 2> erreurs.logecho"Erreur capturée:"cat erreurs.log# Nettoyagerm-f laptops.txt erreurs.log
Récapitulatif des redirections
Symbole
Description
Exemple
>
Redirige stdout vers fichier (écrase)
echo "hello" > file.txt
>>
Redirige stdout vers fichier (ajoute)
echo "world" >> file.txt
2>
Redirige stderr vers fichier
cmd 2> errors.log
&>
Redirige stdout ET stderr
cmd &> all.log
<
Utilise fichier comme entrée
wc -l < file.txt
\|
Pipe : stdout → stdin suivant
cat file \| grep mot
6. Variables et boucles
Automatiser avec des scripts bash :
Voir le code
%%bashecho"=== Variables ==="# Déclarer une variable (PAS d'espace autour du =)nom="Data Engineer"annee=2024dossier_data="/home/user/data"# Utiliser une variable avec $echo"Bienvenue $nom !"echo"Nous sommes en $annee"# Utiliser ${} pour éviter l'ambiguïtéecho"Fichier: ${dossier_data}/ventes.csv"echo""echo"=== Variables d'environnement ==="echo"Home: $HOME"echo"User: $USER"echo"Shell: $SHELL"echo"Path: $PATH"|cut-c1-50# Tronqué pour l'affichage
Voir le code
%%bashecho"=== Boucle for ==="# Créer des fichiers de testmkdir-p data_testtouch data_test/jan.csv data_test/feb.csv data_test/mar.csv# Boucle sur les fichiers CSVfor fichier in data_test/*.csv;doecho"Traitement de: $fichier"echo" Nom: $(basename"$fichier")"doneecho""echo"=== Boucle avec séquence ==="for i in{1..5};doecho"Itération $i"doneecho""echo"=== Boucle while ==="compteur=1while[$compteur-le 3 ];doecho"Compteur: $compteur"((compteur++))done# Nettoyagerm-r data_test/
7. Conditions (if/else)
Prendre des décisions dans tes scripts :
Voir le code
%%bashecho"=== Conditions de base ==="# Vérifier si un fichier existeif[-f"ventes.csv"];thenecho"✅ Le fichier ventes.csv existe"elseecho"❌ Le fichier n'existe pas"fiecho""# Vérifier si un dossier existeif[-d"/tmp"];thenecho"✅ Le dossier /tmp existe"fiecho""# Comparer des nombresnb_lignes=$(wc-l< ventes.csv)echo"Nombre de lignes: $nb_lignes"if[$nb_lignes-gt 5 ];thenecho"📊 Fichier volumineux (> 5 lignes)"elseecho"📄 Petit fichier"fi
Opérateurs de test
Test fichiers
Description
-f fichier
Fichier existe
-d dossier
Dossier existe
-r fichier
Fichier lisible
-w fichier
Fichier modifiable
-s fichier
Fichier non vide
Test nombres
Description
-eq
Égal
-ne
Différent
-gt
Plus grand que
-lt
Plus petit que
-ge
Plus grand ou égal
-le
Plus petit ou égal
Test chaînes
Description
=
Égal
!=
Différent
-z
Chaîne vide
-n
Chaîne non vide
8. Créer et exécuter un script Bash
Un script Bash est simplement un fichier texte contenant des commandes :
Voir le code
%%bash# Créer un script completcat<< 'EOF'> mon_script.sh#!/bin/bash# Script de traitement de données# Auteur: Data Engineer# Date: 2024echo "🚀 Démarrage du script"echo "📅 Date: $(date)"echo "👤 Utilisateur: $USER"echo "📂 Dossier: $(pwd)"# Vérifier si un argument est passéif [ -z "$1" ]; then echo "⚠️ Usage: ./mon_script.sh <nom_fichier>" exit 1fiecho "📄 Fichier à traiter: $1"echo "✅ Script terminé"EOF# Rendre exécutablechmod +x mon_script.sh# Exécuter le scriptecho"=== Exécution sans argument ==="./mon_script.shecho""echo"=== Exécution avec argument ==="./mon_script.sh ventes.csv# Nettoyagerm mon_script.sh
9. Automatisation avec Cron
Cron permet de planifier l’exécution automatique de scripts — indispensable pour les pipelines ETL !
Format d’une ligne crontab
┌───────────── minute (0 - 59)
│ ┌───────────── heure (0 - 23)
│ │ ┌───────────── jour du mois (1 - 31)
│ │ │ ┌───────────── mois (1 - 12)
│ │ │ │ ┌───────────── jour de la semaine (0 - 6) (dimanche = 0)
│ │ │ │ │
* * * * * commande à exécuter
Exemples courants pour Data Engineers
Expression
Description
Cas d’usage
0 2 * * *
Tous les jours à 2h
ETL nocturne
*/15 * * * *
Toutes les 15 minutes
Monitoring
0 0 * * 0
Chaque dimanche à minuit
Rapport hebdomadaire
0 9 1 * *
Le 1er de chaque mois à 9h
Rapport mensuel
0 */4 * * *
Toutes les 4 heures
Synchronisation données
Commandes cron
# Éditer la crontabcrontab-e# Lister les jobs planifiéscrontab-l# Supprimer tous les jobscrontab-r
Exemple de crontab pour Data Engineer
# ETL quotidien à 2h du matin0 2 *** /home/user/scripts/etl_pipeline.sh >> /var/log/etl.log 2>&1# Backup des données chaque dimanche à 3h0 3 ** 0 /home/user/scripts/backup.sh# Nettoyage des fichiers temporaires chaque jour à 4h0 4 *** find /tmp -mtime +7 -delete
💡 Astuce : Utilise crontab.guru pour générer facilement des expressions cron !
Exercice pratique
Instructions
Crée un dossier de travail nommé mon_premier_script
Entre dans ce dossier
Crée un fichier script appelé bonjour.sh
Édite ce fichier et écris un script qui :
Affiche “Bonjour Data Engineer 👋”
Affiche la date du jour
Te souhaite une bonne session
Rends le script exécutable
Crée un sous-dossier nommé data/ et place-y quelques fichiers .csv (même vides)
Ajoute une étape dans le script pour :
Afficher tous les fichiers .csv présents dans le dossier data/
Pour chaque fichier .csv, afficher son nom avec un message comme :
👉 “Fichier trouvé : nom_du_fichier.csv ✅”
📌 Quelle structure utiliser ? (indice : boucle for)
✅ Correction
📥 Afficher la correction complète
#!/bin/bash# 1. 📢 Afficher un message de bienvenueecho"Bonjour Data Engineer 👋"# 2. 🗓️ Afficher la date du jourecho"Date: $(date)"# 3. 💬 Souhaiter une bonne sessionecho"Bonne session de travail 💪"# 4. 📁 Créer le dossier 'data/' s'il n'existe pasmkdir-p data# 5. 🗂️ Créer quelques fichiers de testtouch data/fichier1.csv data/fichier2.csv data/fichier3.csv# 6. 🔁 Lister les fichiers CSVecho""echo"🔍 Recherche de fichiers CSV dans ./data..."for fichier in data/*.csv;doif[-f"$fichier"];thenecho"Fichier trouvé : $(basename"$fichier") ✅"fidone# 7. ✅ Fin du scriptecho""echo"Traitement terminé ✅"
🧠 Conseil : Avant d’exécuter une commande destructive (rm, mv), utilise echo pour voir ce qui serait affecté :
# Au lieu de :rm-rf data/*.csv# D'abord tester avec :echo data/*.csv
Quiz de fin de module
Réponds aux questions suivantes pour vérifier tes acquis.
❓ Q1. Quelle commande affiche le chemin du dossier courant ?
cd
pwd
ls
path
💡 Voir la réponse
✅ Réponse : b — pwd = Print Working Directory
❓ Q2. Que fait la commande rm -rf mon_dossier/ ?
Redémarre l’ordinateur
Réorganise un fichier
Supprime un dossier et son contenu
Reformate le disque
💡 Voir la réponse
✅ Réponse : c — -r = récursif, -f = force (sans confirmation)
❓ Q3. Quelle commande affiche les 10 premières lignes d’un fichier ?
head -n 10
cat -10
start 10
top 10
💡 Voir la réponse
✅ Réponse : a — head -n 10 fichier.txt
❓ Q4. Pourquoi écrire "$fichier" au lieu de $fichier ?
Pour que Bash reconnaisse les fichiers CSV
Pour faire du style
Pour éviter les bugs avec les noms contenant des espaces
Ça n’a pas d’importance
💡 Voir la réponse
✅ Réponse : c — Les guillemets protègent les valeurs contenant des espaces
❓ Q5. Que signifie le | (pipe) en Bash ?
Interrompre une commande
Exécuter un script
Envoyer la sortie d’une commande vers l’entrée d’une autre
Créer un fichier temporaire
💡 Voir la réponse
✅ Réponse : c — Le pipe chaîne les commandes : cmd1 | cmd2
❓ Q6. Quelle expression cron exécute un script tous les jours à 2h du matin ?
2 0 * * *
0 2 * * *
* 2 * * *
0 0 2 * *
💡 Voir la réponse
✅ Réponse : b — Format : minute heure jour mois jour_semaine
Mini-projet : Archiver intelligemment des fichiers CSV
Objectif
Créer un script Bash réaliste qui automatise l’archivage de fichiers .csv selon leur ancienneté.
Contexte
Tu travailles dans une équipe data. Chaque jour, des fichiers .csv sont déposés dans un dossier data/.
Tu dois créer un script qui :
Repère tous les fichiers .csvmodifiés il y a plus de 7 jours
Les archive dans un fichier .tar.gz nommé archive_YYYYMMDD.tar.gz
Déplace ces fichiers dans un dossier archive/
Contraintes
Le script doit fonctionner même si aucun fichier n’est éligible
L’archive doit être horodatée automatiquement
Le dossier archive/ doit être créé s’il n’existe pas
Ajouter du logging pour tracer les actions
✅ Solution du mini-projet
📥 Afficher la solution complète
#!/bin/bash## Script: archive_csv.sh# Description: Archive les fichiers CSV de plus de 7 jours# Auteur: Data Engineer## ConfigurationDATA_DIR="./data"ARCHIVE_DIR="./archive"DAYS_OLD=7DATE_TAG=$(date +%Y%m%d)ARCHIVE_NAME="archive_${DATE_TAG}.tar.gz"LOG_FILE="archive.log"# Fonction de logginglog(){echo"[$(date'+%Y-%m-%d %H:%M:%S')] $1"|tee-a"$LOG_FILE"}log"🚀 Démarrage du script d'archivage"# Vérifier que le dossier source existeif[!-d"$DATA_DIR"];thenlog"❌ Erreur: Le dossier $DATA_DIR n'existe pas"exit 1fi# Créer le dossier d'archive si nécessairemkdir-p"$ARCHIVE_DIR"log"📁 Dossier d'archive: $ARCHIVE_DIR"# Trouver les fichiers CSV de plus de 7 joursOLD_FILES=$(find"$DATA_DIR"-name"*.csv"-mtime +$DAYS_OLD-type f)# Vérifier s'il y a des fichiers à archiverif[-z"$OLD_FILES"];thenlog"ℹ️ Aucun fichier CSV de plus de $DAYS_OLD jours trouvé"exit 0fi# Compter les fichiersNB_FILES=$(echo"$OLD_FILES"|wc-l)log"📊 $NB_FILES fichier(s) à archiver"# Créer l'archivelog"📦 Création de l'archive $ARCHIVE_NAME..."echo"$OLD_FILES"|tar-czvf"$ARCHIVE_DIR/$ARCHIVE_NAME"-T-if[$?-eq 0 ];thenlog"✅ Archive créée avec succès"# Déplacer les fichiers archivésfor file in$OLD_FILES;domv"$file""$ARCHIVE_DIR/"log" ↳ Déplacé: $(basename"$file")"donelog"🎉 Archivage terminé avec succès"elselog"❌ Erreur lors de la création de l'archive"exit 1fi
Pour l’utiliser :
chmod +x archive_csv.sh./archive_csv.sh
Pour l’automatiser avec cron (tous les jours à 3h) :
0 3 *** /home/user/scripts/archive_csv.sh
📚 Ressources pour aller plus loin
🌐 Sites & outils
ExplainShell — Explique n’importe quelle commande Bash
Comment accéder à Bash ?
Installation de WSL sur Windows
Après redémarrage, tu auras accès à un terminal Linux complet !
Vérifier ta version de Bash