Lire et explorer des fichiers
Afficher le contenu d’un fichier et consulter l’aide des commandes.
Objectifs
À la fin de cette leçon, vous saurez :
- afficher un fichier en entier ou par morceaux avec
cat,head,tailetless; - sélectionner des lignes avec
grep, la commande que vous utiliserez toute votre vie ; - retrouver de l'aide sans Internet :
man,--help,which; - retrouver vos propres commandes passées grâce à l'historique.
🔗 Pour vous rafraîchir la mémoire : manipulation de fichiers (
cp,mv,rm)
Préparer un terrain de jeu
Créons un petit fichier pour avoir quelque chose à lire :
$ cd ~
$ nano demo.txt
Écrivez ces six lignes, puis enregistrez (Ctrl+O, Entrée) et quittez (Ctrl+X) :
Le terminal est un dialogue.
cat affiche tout le fichier.
grep filtre les lignes.
less permet de naviguer.
tail montre la fin.
Une erreur se lit jusqu'au bout.
Vérifions immédiatement que le fichier contient bien ce qu'on croit :
$ cat demo.txt
Le terminal est un dialogue.
cat affiche tout le fichier.
grep filtre les lignes.
less permet de naviguer.
tail montre la fin.
Une erreur se lit jusqu'au bout.
cat : tout, d'un bloc
cat (concatenate) recrache le fichier entier sur la sortie standard. Pour un fichier court, c'est l'outil parfait. Son nom révèle son usage historique : concaténer — coller plusieurs fichiers bout à bout. cat a.txt b.txt affiche les deux fichiers à la suite.
Limite du geste : sur un journal de 10 000 lignes, cat défile trop vite pour être lu. Il ne faut alors pas tout afficher, mais sélectionner — c'est le rôle des commandes suivantes.
head et tail : lire par les deux bouts
$ head -n 2 demo.txt
Le terminal est un dialogue.
cat affiche tout le fichier.
$ tail -n 2 demo.txt
tail montre la fin.
Une erreur se lit jusqu'au bout.
head -n N donne les N premières lignes ; tail -n N les N dernières. Sans -n, les deux donnent 10 lignes par défaut.
Cas d'usage concret : un journal système s'allonge en permanence — les lignes nouvelles s'ajoutent à la fin. C'est donc par la fin qu'on regarde :
tail -n 20 /var/log/syslog
Et il existe mieux : tail -f (follow) ne se termine pas. Il affiche la fin puis reste en attente, en affichant chaque nouvelle ligne au fur et à mesure de son apparition — comme une fenêtre de chat qui se met à jour toute seule :
$ tail -f /var/log/syslog
Jan 12 09:30:01 cours CRON[1234]: ...
Jan 12 09:31:17 cours systemd[1]: Started Daily apt download activities...
^C
On interrompt avec Ctrl+C. Retenez ce raccourci dès maintenant : il interrompt n'importe quelle commande en cours. Vous l'utiliserez encore plus souvent que vous ne le pensez.
less : feuilleter confortablement
less /etc/services
less ouvre le fichier dans une visionneuse plein écran : rien ne défile sauvagement, vous contrôlez. Les gestes essentiels :
| Touche | Effet |
|---|---|
| Espace ou Page suivante | avancer d'un écran |
| Flèches haut/bas | ligne par ligne |
/mot | chercher « mot » vers le bas |
n | occurrence suivante de la recherche |
g / G | début / fin du fichier |
q | quitter |
Pourquoi ce nom étrange ? Historique : l'ancêtre more affichait page par page ; less fait pareil « mais mieux » (il permet notamment de remonter). Le nom est resté, la blague aussi.
Règle d'usage : cat pour court, less pour long, head/tail quand on sait où regarder.
grep : le sélecteur de lignes
grep motif fichier parcourt le fichier ligne par ligne et n'affiche que celles qui contiennent le motif :
$ grep affiche demo.txt
cat affiche tout le fichier.
C'est déjà puissant, mais les options multiplient son intérêt :
$ grep -n less demo.txt # -n : numéro de ligne
4:less permet de naviguer.
$ grep -i TOUT demo.txt # -i : ignore majuscules/minuscules
cat affiche tout le fichier.
$ grep -v e demo.txt # -v : inverser (lignes SANS le motif)
Le terminal est un dialogue.
Deux réflexes professionnels :
-npresque toujours : le numéro de ligne permet de rouvrir le fichier directement au bon endroit (dansless: tapez le numéro puisG; dans nano : Ctrl+_).- compter avant de plonger :
grep -ccompte les lignes correspondantes sans les afficher. Savoir qu'un journal contient « 412 erreurs » avant de les lire change la stratégie.
grep accepte plusieurs fichiers (grep erreur *.log) et ne modifie jamais ce qu'il lit : il est pur lecteur. Ce sera demain la pièce centrale des pipes (leçon 1-05) : filtrer la sortie d'une autre commande.
Enfin, une précision honnête : pour l'instant, le motif est un simple texte. grep sait aussi chercher des motifs complexes (expressions régulières) ; nous y reviendrons quand vous aurez accumulé assez de pratique pour en avoir besoin.
Se passer d'Internet pour obtenir de l'aide
man : le manuel intégré
man grep
Chaque commande sérieuse installe sa page de manuel. C'est une référence complète, hors connexion, organisée en sections. Les deux premières suffisent au quotidien :
- NAME : ce que fait la commande, en une phrase ;
- SYNOPSIS : la grammaire d'appel, avec conventions d'écriture :
grep [OPTION]... MOTIF [FICHIER]...se lit « options facultatives, puis un motif obligatoire, puis des fichiers facultatifs » ; les crochets[...]marquent le facultatif, les points de suspension « répétable ».
La navigation est celle de less (même technologie) : espace pour avancer, /mot pour chercher dans la page, q pour sortir. Cherchez par exemple /recursive dans man cp.
--help : le résumé express
$ grep --help
Utilisation : grep [OPTION]... MOTIF [FICHIER]...
Recherche MOTIF dans chaque FICHIER...
...
Plus court que le manuel, souvent traduit, idéal pour vérifier une option dont on a oublié le sens exact. Réflexe conseillé : --help d'abord, man si besoin de profondeur.
which : où est installé ce programme ?
$ which grep
/usr/bin/grep
$ which nodejs-inexistant
$
which répond par le chemin complet de l'exécutable trouvé — ou ne dit rien (et rend une erreur) si le programme n'existe pas ou n'est pas accessible. Utile pour diagnostiquer « commande introuvable » : si which node ne répond rien, le problème n'est pas votre frappe, c'est l'installation.
Retrouver ses commandes passées
Le shell mémorise vos commandes. Trois façons d'en profiter :
Flèches haut/bas : remonter et redescendre dans l'historique récent. Le réflexe le plus utilisé de tous.
La commande history :
$ history
501 cd ~
502 nano demo.txt
503 cat demo.txt
504 grep -n less demo.txt
Chaque ligne porte un numéro. Relancer la commande 502 sans la retaper : !502. Relancer la dernière : !!.
La recherche incrémentale Ctrl+R : appuyez sur Ctrl+R puis tapez un fragment (« grep ») : le shell rappelle immédiatement la dernière commande contenant ce fragment. Répétez Ctrl+R pour remonter aux occurrences précédentes, Entrée pour relancer, flèche droite pour éditer avant de lancer.
Ce mécanisme explique pourquoi les développeurs ne retapent jamais leurs longues commandes du matin : elles sont là, à trois touches. Et il annonce la suite du cursus : ce que vous tapez aujourd'hui à la main, vous le mettrez bientôt dans des scripts pour l'automatiser.
Exercice
- Recherchez toutes les mentions de « erreurs » dans
demo.txt. - Affichez les 3 premières lignes de
/etc/hosts. - Comptez combien de lignes de
/etc/servicescontiennent « http », sans afficher ces lignes. - Ouvrez
/etc/servicesdansless, cherchez-y « domain », quittez. - Trouvez le chemin de
curlavecwhich, puis affichez le début de son aide avec--help(les premières lignes suffisent — quelle commande pour limiter l'affichage ?). - Avec l'historique, relancez la commande de la question 2 sans la retaper.
Résumé
catpour court,lesspour long (espace,/recherche,q),head/tailpour cibler les bouts,tail -fpour suivre un journal vivant (Ctrl+C pour couper).grep motifsélectionne des lignes ;-najoute les numéros,-iignore la casse,-ccompte,-vinverse.mandocumente en profondeur (SYNOPSIS = grammaire),--helprésume,whichlocalise.- L'historique (flèches,
history, Ctrl+R) fait gagner du temps tous les jours.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Exercice 1.
grep erreurs demo.txt
Attention au pluriel : grep erreur n'aurait pas renvoyé la dernière ligne (elle contient « erreurs »… en fait si, car « erreurs » contient la chaîne « erreur »). Précisons donc : grep erreur renvoie bien la ligne, car grep cherche une sous-chaîne : toute ligne contenant « erreurs » contient nécessairement « erreur ». La réciproque est fausse — c'est elle qu'il faut surveiller.
Exercice 2.
$ head -n 3 /etc/hosts
127.0.0.1 localhost
127.0.1.1 cours
::1 localhost ip6-localhost ip6-loopback
Variante acceptée : head -3 /etc/hosts fonctionne aussi (forme courte). Ces lignes associent des adresses à des noms localement — sujet approfondi au chapitre DNS.
Exercice 3.
$ grep -c http /etc/services
62
(Le chiffre exact peut varier selon la VM.) Sans -c, on aurait eu 62 lignes à lire ; avec, un seul nombre. C'est le réflexe « mesurer avant de lire ».
Exercice 4.
less /etc/services
/domain # cherche la première occurrence
n # occurrence suivante, autant de fois que voulu
q # sortie
Exercice 5.
$ which curl
/usr/bin/curl
$ curl --help | head -n 10
Usage: curl [options...] <url>
...
Le point subtil était la fin de question : curl --help produit plus de 100 lignes. En y ajoutant | head -n 10, seule la sortie de curl --help limitée à 10 lignes s'affiche — ce symbole | est un pipe : il envoie la sortie d'une commande vers l'entrée d'une autre. C'est précisément le sujet de la prochaine leçon.
Exercice 6. Plusieurs méthodes valables :
- flèche haut plusieurs fois jusqu'à retomber sur
head -n 3 /etc/hosts, Entrée ; Ctrl+R, taperhosts, Entrée ;- repérer son numéro dans
history(par exemple 512) puis!512.