05 - nano, vim, sed et awk
Ce que tu vas apprendre
- nano : l'éditeur simple qui fait le job
- vim : les bases pour ne pas rester coince (et pourquoi apprendre)
- sed : éditer un fichier sans l'ouvrir
- awk : extraire et transformer des colonnes de texte
Prerequisites
Savoir naviguer dans le terminal et manipuler des fichiers. Voir l'article sur les fichiers.
Pourquoi apprendre un éditeur terminal
Tu as VSCode. Tu as IntelliJ. Pourquoi t'embeter avec un éditeur dans le terminal ? Parce que sur un serveur en SSH, tu n'as pas le choix. Quand tu dois modifier un fichier de config nginx, un .env en production, ou un crontab, tu ne vas pas installer VSCode sur le serveur. Tu dois pouvoir éditer un fichier, sauvegarder, et sortir. Vite.
nano : le choix raisonnable
nano est installe presque partout et fonctionne comme un éditeur normal. Pas de modes, pas de commandes cryptiques :
bash# Ouvrir un fichier
nano /etc/nginx/sites-available/monsite.conf
# Ouvrir a une ligne specifique
nano +42 config.yaml
Les raccourcis sont affiches en bas de l'ecran (le ^ signifie Ctrl) :
^O Sauvegarder (Write Out)
^X Quitter
^K Couper la ligne
^U Coller
^W Chercher
^/ Chercher et remplacer
^G Aide
Pour 90% des edits rapides sur un serveur, nano suffit. Pas besoin de s'excuser d'utiliser nano. Ca fait le travail.
vim : le couteau suisse
vim, c'est l'éditeur qui a une courbe d'apprentissage en forme de falaise. Les 30 premières minutes sont penibles. Mais une fois que tu passes le cap, tu edites du texte plus vite qu'avec n'importe quel autre outil. Et surtout, vim est installe sur chaque machine Linux de la planete.
Les modes de vim
vim fonctionne avec des modes. C'est le concept qui deroute tout le monde :
Mode NORMAL : tu navigues et tu executes des commandes (mode par defaut)
Mode INSERT : tu tapes du texte (comme un editeur normal)
Mode VISUAL : tu selectionnes du texte
Mode COMMAND : tu tapes des commandes (commencent par :)
bash# Ouvrir vim
vim fichier.txt
# Tu es en mode NORMAL. Pour taper du texte :
i # Passe en mode INSERT (avant le curseur)
a # Passe en mode INSERT (apres le curseur)
o # Nouvelle ligne en dessous et mode INSERT
O # Nouvelle ligne au-dessus et mode INSERT
# Pour quitter le mode INSERT :
Esc # Retour en mode NORMAL
Sauvegarder et quitter (la question universelle)
bash:w # Sauvegarder
:q # Quitter
:wq # Sauvegarder et quitter
:q! # Quitter sans sauvegarder (forcer)
:wq! # Sauvegarder et quitter (forcer)
ZZ # Raccourci pour :wq (en mode NORMAL)
"Comment quitter vim" est une des questions les plus posees sur StackOverflow. Plus d'un million de vues. Tu n'es pas seul.
Les commandes de base en mode NORMAL
bash# Navigation
h j k l # Gauche, bas, haut, droite (ou les fleches)
w # Mot suivant
b # Mot precedent
0 # Debut de ligne
$ # Fin de ligne
gg # Debut du fichier
G # Fin du fichier
42G # Aller a la ligne 42
# Edition
dd # Supprimer la ligne
yy # Copier la ligne
p # Coller apres le curseur
u # Annuler (undo)
Ctrl+R # Refaire (redo)
x # Supprimer le caractere sous le curseur
cw # Changer le mot (supprime et passe en INSERT)
# Recherche
/motif # Chercher vers le bas
?motif # Chercher vers le haut
n # Occurrence suivante
N # Occurrence precedente
# Remplacement
:%s/ancien/nouveau/g # Remplacer tout dans le fichier
:%s/ancien/nouveau/gc # Avec confirmation pour chaque occurrence
:10,20s/foo/bar/g # Remplacer entre les lignes 10 et 20
Mon workflow vim minimal
Quand je dois éditer un fichier de config sur un serveur, voici exactement ce que je fais :
bashvim /etc/nginx/nginx.conf
# 1. /worker_connections (chercher le parametre)
# 2. n (occurrence suivante si besoin)
# 3. cw (changer le mot)
# 4. 2048 (taper la nouvelle valeur)
# 5. Esc (retour en mode NORMAL)
# 6. :wq (sauvegarder et quitter)
Six étapes. Dix secondes. C'est la puissance de vim une fois que les bases sont acquises.
sed : éditer sans ouvrir
sed (stream editor) modifie du texte a la volee. C'est l'outil parfait pour les modifications scriptables :
bash# Remplacer la premiere occurrence sur chaque ligne
sed 's/ancien/nouveau/' fichier.txt
# Remplacer toutes les occurrences (g = global)
sed 's/ancien/nouveau/g' fichier.txt
# Modifier le fichier en place (-i)
sed -i 's/localhost/0.0.0.0/g' config.yaml
# Avec backup avant modification
sed -i.bak 's/localhost/0.0.0.0/g' config.yaml
# Cree config.yaml.bak avec l'original
# Supprimer des lignes
sed '/^#/d' config.conf # Supprimer les commentaires
sed '/^$/d' fichier.txt # Supprimer les lignes vides
sed '10,20d' fichier.txt # Supprimer les lignes 10 a 20
# Inserer du texte
sed '1i\# Ce fichier est genere automatiquement' config.conf
# Insere un commentaire en premiere ligne
# Plusieurs operations a la chaine
sed -e 's/foo/bar/g' -e '/^$/d' -e 's/ */ /g' fichier.txt
Les cas d'usage réels que j'utilise régulièrement :
bash# Changer le port dans un fichier de config
sed -i 's/PORT=3000/PORT=8080/' .env
# Commenter une ligne
sed -i 's/^listen 80;/#listen 80;/' nginx.conf
# Decommenter une ligne
sed -i 's/^#listen 443;/listen 443;/' nginx.conf
# Remplacer dans tous les fichiers d'un dossier
find . -name "*.ts" -exec sed -i 's/oldFunction/newFunction/g' {} +
awk : traitement de colonnes
awk est un langage de traitement de texte. Ca semble intimidant, mais les bases couvrent 80% des besoins :
bash# Afficher une colonne (separateur par defaut : espaces)
$ df -h | awk '{print $1, $5}'
Filesystem Use%
/dev/sda1 45%
tmpfs 0%
# Avec un separateur specifique
$ cat /etc/passwd | awk -F: '{print $1, $7}'
root /bin/bash
nicolas /bin/bash
www-data /usr/sbin/nologin
# Filtrer par condition
$ ps aux | awk '$3 > 50 {print $11, $3"%"}'
# Affiche les processus qui utilisent plus de 50% CPU
# Calculer une somme
$ ls -l *.log | awk '{total += $5} END {print "Total:", total/1024/1024, "Mo"}'
Total: 42.5 Mo
# Compter les occurrences
$ cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10
# Top 10 des IP les plus frequentes
Un exemple que j'utilise toutes les semaines : analyser les logs d'acces nginx pour trouver les endpoints les plus sollicites :
bashawk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
Ca affiche les 20 URLs les plus demandees avec leur nombre de requêtes. Pas besoin d'un outil de monitoring sophistique pour un diagnostic rapide.
Pour des cas d'usage plus avances de sed et awk dans des pipelines de déploiement, paltemps.fr propose des exemples concrets.
Résumé
- nano pour les edits rapides : simple, intuitif, installe partout
- vim :
ipour insérer,Escpour le mode normal,:wqpour sauvegarder et quitter - sed pour les modifications automatisables :
sed -i 's/ancien/nouveau/g' - awk pour extraire des colonnes :
awk '{print $1, $3}' - Apprendre vim prend du temps mais c'est un investissement qui paie
Precedent : Utilisateurs et groupes | Suivant : Pipes et redirections