Aller au contenu

Linux : texte, éditeurs et redirections

Linux traite le texte comme un flux : des petits programmes lisent du texte, le transforment, et le passent au suivant. Combiner ces programmes est l’un des grands atouts du système. Pour écrire des scripts, voir Bash : premiers scripts et Bash : redirections et pipes.

Flux Numéro Rôle Par défaut
stdin 0 Entrée standard Clavier
stdout 1 Sortie standard Écran
stderr 2 Sortie d’erreurs Écran
Fenêtre de terminal
ls /etc > liste.txt # sortie vers un fichier (ÉCRASE)
ls /var >> liste.txt # ajoute à la fin
sort < desordre.txt # lit l'entrée depuis un fichier
commande 2> erreurs.log # erreurs vers un fichier
commande > sortie.log 2>&1 # sortie ET erreurs dans le même fichier
commande &> tout.log # idem (bash)
commande > /dev/null # jeter la sortie
commande 2> /dev/null # jeter les erreurs
commande > /dev/null 2>&1 # tout jeter
Redirection Effet
> Écrit (écrase)
>> Ajoute
< Lit depuis un fichier
2> Redirige les erreurs
2>&1 Envoie les erreurs là où va la sortie standard

Un tube envoie la sortie d’une commande vers l’entrée de la suivante :

Fenêtre de terminal
ls -l /etc | less # lire page par page
ps aux | grep nginx # filtrer
cat /var/log/auth.log | grep "Failed" | wc -l # compter les échecs
du -sh /var/* 2>/dev/null | sort -h | tail -5 # les 5 plus gros dossiers
history | grep ssh

Le principe : chaque programme fait une chose, on les enchaîne.

Commande Rôle Exemple
grep Filtrer des lignes grep -i "erreur" app.log
sort Trier sort -n nombres.txt, sort -u (sans doublons)
uniq Supprimer les doublons consécutifs sort fichier | uniq -c (compter)
wc Compter lignes, mots, octets wc -l fichier
cut Extraire des colonnes cut -d: -f1 /etc/passwd
head / tail Début / fin tail -n 20 app.log
tr Remplacer des caractères echo "A B" | tr ' ' '_'
tee Écrire dans un fichier et afficher commande | tee sortie.log
xargs Transformer l’entrée en arguments find . -name "*.tmp" | xargs rm
diff Comparer deux fichiers diff -u ancien.txt nouveau.txt
Fenêtre de terminal
cut -d: -f1 /etc/passwd | sort # liste des comptes
grep -c "" fichier.txt # nombre de lignes
awk '{print $1}' acces.log | sort | uniq -c | sort -rn | head # adresses les plus fréquentes
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -rn | head
sort fichier.txt | uniq -d # lignes en double
diff -u /etc/hosts /etc/hosts.sauvegarde
Fenêtre de terminal
sed 's/ancien/nouveau/' fichier.txt # première occurrence de chaque ligne
sed 's/ancien/nouveau/g' fichier.txt # toutes les occurrences
sed -i 's/ancien/nouveau/g' fichier.txt # MODIFIE le fichier en place
sed -i.bak 's/ancien/nouveau/g' fichier.txt # en place, avec copie de sauvegarde
sed -n '10,20p' fichier.txt # lignes 10 à 20
sed '/^#/d' fichier.conf # supprimer les commentaires
sed '/^$/d' fichier.txt # supprimer les lignes vides

sed -i modifie le fichier définitivement : tester d’abord sans -i, ou utiliser -i.bak.

Fenêtre de terminal
awk '{print $1}' fichier.txt # première colonne
awk -F: '{print $1, $3}' /etc/passwd # séparateur « : », colonnes 1 et 3
awk '$3 > 1000 {print $1}' donnees.txt # filtrer sur une valeur
awk '{somme += $2} END {print somme}' ventes.txt
awk 'NR>1' fichier.csv # sans l'en-tête
Motif Correspond à
. N’importe quel caractère
* Zéro ou plus du précédent
^ / $ Début / fin de ligne
[abc] Un des caractères
| (avec -E) Ou
+, ? (avec -E) Un ou plus, zéro ou un
Fenêtre de terminal
grep "^root" /etc/passwd
grep -E "^(root|alice):" /etc/passwd
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" acces.log

Les caractères spéciaux d’une expression régulière sont différents des jokers du shell (*.txt) : mettre l’expression entre guillemets pour que le shell n’y touche pas.

Fenêtre de terminal
nano fichier.txt
sudo nano /etc/hosts
Raccourci Action
Ctrl+O puis Entrée Enregistrer
Ctrl+X Quitter
Ctrl+W Rechercher
Ctrl+K / Ctrl+U Couper la ligne / coller
Ctrl+G Aide
Alt+U Annuler

Les raccourcis sont affichés en bas de l’écran (^ = Ctrl). Pour un fichier de configuration système, utiliser sudo nano ; pour définir nano comme éditeur par défaut : export EDITOR=nano (ou sudo update-alternatives --config editor).

Fenêtre de terminal
vim fichier.txt # (sudo apt install vim ; vi est présent par défaut)

vim est modal : le clavier fait des choses différentes selon le mode.

Mode Accès Usage
Normal Échap Se déplacer, copier, supprimer
Insertion i (avant le curseur), a (après), o (nouvelle ligne) Écrire du texte
Commande : Enregistrer, quitter, chercher

Survie minimale :

Besoin Touches
Écrire i, taper, Échap
Enregistrer et quitter Échap puis :wq puis Entrée
Quitter sans enregistrer Échap puis :q! puis Entrée
Enregistrer seulement :w
Chercher /motif puis Entrée (n : suivant)
Supprimer une ligne dd
Copier / coller une ligne yy / p
Annuler / rétablir u / Ctrl+R
Aller à la fin / au début du fichier G / gg
Remplacer partout :%s/ancien/nouveau/g

Savoir quitter vim (Échap, :q!) évite bien des déconvenues sur un serveur. vimtutor lance un tutoriel interactif de 30 minutes.

Sur un poste de développement, VS Code (avec l’extension Remote - SSH) permet d’éditer des fichiers d’un serveur distant ; en ligne de commande pure, nano suffit pour les fichiers de configuration.

  1. Sauvegarder : sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.sauvegarde.
  2. Éditer : sudo nano /etc/ssh/sshd_config.
  3. Vérifier la syntaxe si le service le permet (sudo sshd -t, sudo nginx -t).
  4. Recharger : sudo systemctl reload ssh.
  5. Tester (sur un serveur distant : depuis une seconde session, avant de fermer la première).
  6. En cas de problème : restaurer la sauvegarde.

Pour comparer ses modifications : diff -u /etc/ssh/sshd_config.sauvegarde /etc/ssh/sshd_config. Pour versionner sa configuration : etckeeper (sudo apt install etckeeper) place /etc sous Git.

Fenêtre de terminal
nom="Alice"
echo "Bonjour $nom"
fichiers=$(ls *.txt | wc -l) # résultat d'une commande dans une variable
echo "Il y a $fichiers fichiers texte"
echo "Aujourd'hui : $(date +%F)"
cp rapport.txt "rapport-$(date +%F).txt"

$(commande) insère le résultat d’une commande. Ces mécanismes sont la base des scripts : Bash : variables.

#!/usr/bin/env bash
set -euo pipefail
dossier="${1:-.}"
echo "Les 5 plus gros fichiers de $dossier :"
du -ah "$dossier" 2>/dev/null | sort -rh | head -5
Fenêtre de terminal
nano gros-fichiers.sh
chmod +x gros-fichiers.sh
./gros-fichiers.sh /var/log

Voir Bash : premiers scripts pour continuer.

Symptôme Piste
Le fichier a été vidé après un > > écrase : utiliser >>, ou set -o noclobber
sudo echo x > /etc/fichier : Permission denied La redirection est faite par votre shell : echo x | sudo tee /etc/fichier
grep ne trouve rien Casse (-i), expression régulière sans -E, guillemets
sort classe 10 avant 2 Tri alphabétique : sort -n pour un tri numérique
uniq ne supprime pas les doublons Ils ne sont pas consécutifs : trier d’abord (sort | uniq)
sed -i a abîmé un fichier Utiliser -i.bak et restaurer ; tester sans -i
Impossible de quitter vim Échap, puis :q! ou :wq
Caractères étranges dans un fichier venu de Windows Fins de ligne CRLF : sudo apt install dos2unix, dos2unix fichier
nano : Error opening terminal: unknown Variable TERM incorrecte (connexion exotique) : export TERM=xterm

Ubuntu 24.04 et 26.04 : différences à connaître

Section intitulée « Ubuntu 24.04 et 26.04 : différences à connaître »

nano est l’éditeur par défaut sur les deux versions. Les outils de traitement de texte (grep, sed, awk) ont les mêmes options pour l’usage courant ; sur 26.04, certains outils de base peuvent être des réécritures : en cas de différence, commande --help.