Introduction au scripting Shell et commandes utilitaires

Qu'est-ce qu'un script ?

Un script est un ensemble d'instructions textuelles exécutables. Parmi les langages de script courants, on trouve JavaScript, Python, PHP, Ruby, Perl et bien sûr Shell.

Pourquoi utiliser le Shell ?

  • Langage intégré nativement aux systèmes Unix/Linux
  • Productivité élevée grâce à la puissance des commandes système
  • Syntaxe accessible et courbe d'apprentissage rapide
  • Idéal pour l'automatisation et les traitements par lots

Le Shell comme intermédiaire

Le Shell agit comme interface entre l'utilisateur et le noyau Linux. Écrit initialement en C, il interprète les commandes saisies et les transmet au noyau pour exécution.

Types de Shell

Interface graphique (GUI)

Environenments de bureau comme KDE, GNOME offrant une manipulation intuitive via fenêtres et icônes.

Interface en ligne de commande (CLI)

Interaction par saisie textuelle. Bash (Bourne-Again Shell) est l'implémentation standard sur la plupart des distributions Linux. D'autres existent : zsh, fish, ksh, csh.

Identifier votre Shell

Les interpréteurs disponibles sont listés dans /etc/shells :

$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/zsh
/usr/bin/fish

Pour connaître le Shell par défaut :

$ echo $SHELL
/bin/bash

Votre premier script

Créons un fichier bonjour.sh :

$ vim bonjour.sh
#!/bin/bash
echo "Bienvenue dans le monde Shell!"

Méthodes d'exécution

Méthode A : Invocation directe de l'interpréteur

$ bash bonjour.sh
Bienvenue dans le monde Shell!

Méthode B : Exécution avec permissions

$ chmod u+x bonjour.sh
$ ./bonjour.sh
Bienvenue dans le monde Shell!

Remarque : le préfixe ./ est nécessaire car le répertoire courant n'est généralement pas dans la variable PATH.

Méthode C : Exécution dans l'environnement courant

$ source bonjour.sh

Différences entre les modes d'exécution

Méthode Processus Portée des variables
bash script.sh Sous-shell créé Variables locales au sous-shell
./script.sh Sous-shell créé Variables locales au sous-shell
source script.sh Aucun sous-shell Variibles persistantes dans le shell parent

Commandes essentielles pour le traitement de texte

grep : filtrage de motifs

Recherche de patterns dans des fichiers ou l'entrée standard.

Option Fonction
-i Insensible à la casse
-n Affiche les numéros de ligne
-o N'affiche que les correspondances
-c Compte les lignes correspondantes
-v Inverce la sélection (lignes non correspondantes)
-A N Affiche N lignes après la correspondance
-B N Affiche N lignes avant la correspondance
-C N Affiche N lignes de contexte
# Recherche insensible à la casse
$ echo "Bonjour Monde bonjour monde" | grep -i 'monde'
Bonjour Monde bonjour monde

# Affichage avec numéros de ligne
$ grep -n 'daemon' /etc/passwd
2:daemon:x:2:2:daemon:/sbin:/sbin/nologin

# Extraction uniquement des correspondances
$ echo "erreur: fichier introuvable" | grep -o '[a-z]*:'
erreur:

# Comptage des occurrences
$ grep -c 'nologin' /etc/passwd
16

cut : extraction de champs

Découpe des lignes selon des critères précis.

# Extraction par position de caractères
$ echo "2024-03-15" | cut -c 1-4
2024

# Extraction par délimiteur
$ echo "pierre:25:paris" | cut -d':' -f1,3
pierre:paris

# Extraction du troisième champ
$ cut -d' ' -f3 journal.log

sort : tri de données

Organise les lignes selon divers critères.

Option Description
-n Tri numérique
-r Ordre décroissant
-k N Tri selon le Nième champ
-t C Utilise C comme séparateur de champs
-u Supprime les doublons
# Tri numérique décroissant
$ echo -e "42\n7\n123\n5" | sort -nr
123
42
7
5

# Tri selon le deuxième champ (délimité par :)
$ cat notes.txt | sort -t':' -k2 -n

# Suppression des doublons
$ sort -u noms.txt

uniq : dédoublonnage

Élimine ou compte les lignes identiques consécutives.

# Comptage des occurrences
$ uniq -c frequences.txt
   3 alpha
   1 beta
   5 gamma

# Affichage des lignes uniques (non répétées)
$ uniq -u log.txt

# Combinaison avec sort pour dédoublonner tout fichier
$ sort donnees.txt | uniq

seq : génération de séquences

Crée des suites numériques pour les boucles et tests.

# Séquence simple
$ seq 5
1
2
3
4
5

# Avec pas personnalisé
$ seq 0 2 10
0
2
4
6
8
10

# Format avec padding
$ seq -w 1 100 | tail -3
098
099
100

tr : transformation de caractères

Substitue ou supprime des caractères.

# Conversion casse
$ echo "Hello World" | tr 'A-Z' 'a-z'
hello world

# Suppression de caractères
$ echo "Tél: 01-23-45-67-89" | tr -d '0-9- '
Tél:

# Remplacement de caractères spécifiques
$ echo "hello_world" | tr '_' '-'
hello-world

# Compression des répétitions
$ echo "aaabbbccc" | tr -s 'a-c'
abc

Exercices pratiques

Exercice 1 : Créer un script qui ajoute un utilisateur apprenti et crée dans son répertoire personnel un fichier readme.txt contenant la date du jour.

Exercice 2 : Déterminer le nombre total de comptes utilisateurs sur le système.

Exercice 3 : Évaluer la quantité de paquets installés.

Défi : Analyse de logs web

À partir d'un fichier contenant des URLs, réalisez les opérations suivantes :

  1. Compter les occurrences de chaque domaine
  2. Classer les résultats par fréquence croissante
  3. Extraire les deux domaines les plus fréquents

Approche possible :

# Pipeline de traitement
$ cat acces.log | cut -d'/' -f3 | sort | uniq -c | sort -n | tail -2

Étiquettes: bash shell-scripting linux-cli text-processing grep

Publié le 8 août à 17h08