Chercher
grep cherche du texte dans les fichiers.
find cherche les fichiers eux-mêmes.
L’option -r de grep et -exec de find étendent leur portée à tout un projet (dossier).
Linux offre un ensemble de commandes conçues pour chercher, filtrer, compter, trier et enchaîner des opérations sur du texte. Ces commandes sont les outils quotidiens de quiconque travaille avec un serveur, un terminal ou un pipeline de déploiement.
grep : Chercher du texte dans les fichiersgrep est l’outil de recherche de texte le plus utilisé en Linux. Son nom vient de Global Regular Expression Print.
Il parcourt un fichier ligne par ligne et affiche uniquement les lignes qui contiennent le motif recherché.
grep "motif" fichierPar exemple, pour trouver toutes les erreurs dans un log :
grep "ERROR" /var/log/serveur.log# [2026-05-07 10:40:22] ERROR Timeout de la base de données# [2026-05-07 11:05:12] ERROR Timeout de la base de donnéesgrep n’affiche que les lignes correspondantes. Tout le reste du fichier est ignoré.
| Option | Effet | Exemple |
|---|---|---|
-n | Affiche le numéro de ligne | grep -n "ERROR" log.txt |
-i | Insensible à la casse (majuscules/minuscules) | grep -i "error" log.txt |
-c | Compte le nombre de lignes correspondantes | grep -c "404" acces.log |
-r | Cherche récursivement dans un dossier | grep -r "TODO" src/ |
-v | Inverse le filtre (lignes qui ne contiennent PAS le motif) | grep -v "INFO" erreurs.log |
--include | Limite la recherche à certains types de fichiers | grep -r --include="*.js" "console.log" . |
Quand tu travailles sur un projet web, tes fichiers sont répartis dans plusieurs dossiers. L’option -r permet à grep de parcourir toute l’arborescence :
grep -rn --include="*.js" "console.log" .# ./src/app.js:12: console.log("Serveur démarré");# ./src/api/routes.js:45: console.log("Requête reçue:", req.url);grep -rn "FIXME" .find : Chercher des fichiersgrep cherche du texte dans les fichiers. find cherche les fichiers eux-mêmes en utilisant un critère: nom, type, taille ou date.
find chemin -critère valeurfind . -name "*.css"./css/style.css./css/navigation.cssfind . -name "*.js"# ./js/validation.js./js/app.js./js/validation.js| Critère | Effet | Exemple |
|---|---|---|
-name "motif" | Cherche par nom (sensible à la casse) | find . -name "*.html" |
-iname "motif" | Cherche par nom, insensible à la casse | find . -iname "readme*" |
-type f | Seulement les fichiers | find . -type f |
-type d | Seulement les dossiers | find . -type d |
-maxdepth N | Limite la profondeur de recherche | find . -maxdepth 1 -name "*.html" |
find . -type d../css./js./img./pagesfind . -maxdepth 1 -name "*.html"./index.htmlfind /etc -name "*.conf" -type ffind peut appeler une commande sur chaque fichier trouvé avec l’option -exec :
find . -name "*.css" -exec wc -l {} +26 ./css/navigation.css63 ./css/style.css126 totalfind . -name "*.sh" -exec ls -l {} +La syntaxe est particulière :
{} est remplacé par le nom du fichier trouvé+ (ou \;) termine la commande.wc : Compter les lignes, les mots et les caractèreswc (word count) est un outil de comptage simple mais essentiel. Il compte les lignes, les mots et les caractères d’un fichier ou d’une entrée.
wc fichier.txt# 42 186 1205 fichier.txt# lignes mots caractères| Option | Compte | Exemple |
|---|---|---|
-l | Lignes seulement | wc -l acces.log |
-w | Mots seulement | wc -w article.txt |
-c | Caractères (octets) seulement | wc -c style.css |
wc -l acces.log26 acces.logwc -l css/*.css26 css/navigation.css63 css/style.css37 css/typo.css126 totalNB_LIGNES=$(cat acces.log | wc -l)echo "Nombre de requêtes : $NB_LIGNES"sortsort prend un fichier (ou une entrée) et trie ses lignes par ordre alphabétique par défaut.
cat fruits.txtbananeceriseabricotdattesort fruits.txtabricotbananecerisedatte| Option | Effet | Exemple |
|---|---|---|
-r | Tri inversé (Z → A) | sort -r fichier.txt |
-n | Tri numérique (1, 2, 10 au lieu de 1, 10, 2) | sort -n nombres.txt |
-u | Retire les doublons en triant | sort -u fichier.txt |
-k N | Trie selon la N-ième colonne | sort -k 2 fichier.txt |
sort -k 8 acces.logdu -sh * | sort -rn12M node_modules/ 2M images/45K index.html 8K style.cssuniq : Éliminer les doublonsuniq supprime les lignes consécutives identiques. Il est presque toujours utilisé après sort, car les doublons doivent être adjacents pour être détectés.
cat visites.txt/index.html/produits/index.html ← pas adjacent au premier, uniq ne le verra pas/contactsort visites.txt | uniq/contact/index.html/produits| Option | Effet | Exemple |
|---|---|---|
-c | Compte les occurrences de chaque ligne | sort fichier | uniq -c |
-d | Affiche seulement les doublons | sort fichier | uniq -d |
cat acces.log | awk '{print $6}' | sort | uniq -c | sort -rn# 5 /api/produits# 3 /index.html# 2 /api/commande# 1 /contact# 1 /aproposawk '{print $6}' extrait la 6e colonne de chaque ligne (ici, l’URL).awk. Retiens juste que awk '{print $N}' extrait la N-ième colonne d’un texte.Cet enchaînement est un classique de l’analyse de logs. On y reviendra dans la section sur les pipes.
Par défaut, chaque commande affiche son résultat à l’écran (la sortie standard, appelée stdout). Les redirections permettent d’envoyer ce résultat ailleurs — typiquement dans un fichier.
Chaque commande Linux a trois flux de données :
| Flux | Numéro | Nom | Rôle |
|---|---|---|---|
| stdin | 0 | Entrée standard | Ce que la commande lit (par défaut : le clavier) |
| stdout | 1 | Sortie standard | Ce que la commande affiche (par défaut : l’écran) |
| stderr | 2 | Sortie d’erreur | Les messages d’erreur (par défaut : l’écran aussi) |
La sortie normale et les erreurs sont deux flux séparés, même si les deux s’affichent à l’écran. Les redirections te permettent de les diriger indépendamment.
> écrit dans un fichier (ÉCRASE le contenu s’il existe)echo "Bonjour" > message.txtcat message.txt# Bonjour>> AJOUTE à la fin du fichier (sans écraser)echo "Au revoir" >> message.txtcat message.txt# Bonjour# Au revoir# Sauvegarder les erreurs d'un log dans un fichier séparégrep "ERROR" /var/log/serveur.log > erreurs-du-jour.txt
# Construire un rapport ligne par ligneecho "Rapport du $(date +%Y-%m-%d)" > rapport.txtecho "=============================" >> rapport.txtecho "" >> rapport.txtecho "Erreurs trouvées :" >> rapport.txtgrep "ERROR" serveur.log >> rapport.txtecho "" >> rapport.txtecho "Nombre total : $(grep -c "ERROR" serveur.log)" >> rapport.txtLe pipe (|) est l’outil le plus puissant du terminal.
Il prend la sortie d’une commande et l’envoie comme entrée à la commande suivante —
comme un tuyau qui connecte deux machines.
commande1 | commande2 | commande3La sortie de commande1 devient l’entrée de commande2, dont la sortie devient l’entrée de commande3. Chaque commande agit comme un filtre qui transforme les données en transit.
ls | wc -lps aux | grep "node"cat serveur.log | tail -5Prenons grep "ERROR" serveur.log | wc -l :
grep "ERROR" serveur.log lit le fichier et affiche les lignes contenant ERROR| intercepte cette sortie (au lieu de l’afficher à l’écran)wc -l reçoit ces lignes et compte combien il y en aChaque commande ne connaît que son entrée et sa sortie — elle ne sait pas ce qu’il y a avant ou après dans la chaîne.
Assumons un fichier access.log avec le contenu suivant:
127.0.0.1 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532127.0.0.2 - - [13/May/2026] "GET /about.html HTTP/1.1" 404 210127.0.0.3 - - [13/May/2026] "GET /products HTTP/1.1" 200 888127.0.0.4 - - [13/May/2026] "GET /products/43 HTTP/1.1" 404 220127.0.0.5 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200127.0.0.6 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532127.0.0.7 - - [13/May/2026] "GET /products HTTP/1.1" 500 100127.0.0.8 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532127.0.0.9 - - [13/May/2026] "GET /contact HTTP/1.1" 200 300127.0.0.10 - - [13/May/2026] "POST /contact HTTP/1.1" 500 100127.0.0.11 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200127.0.0.12 - - [13/May/2026] "GET /products HTTP/1.1" 200 888127.0.0.13 - - [13/May/2026] "GET /acceuil.html HTTP/1.1" 404 220127.0.0.14 - - [13/May/2026] "POST /login HTTP/1.1" 400 220127.0.0.15 - - [13/May/2026] "POST /signup HTTP/1.1" 201 100find . -name "*.js" | wc -l# 3grep "404" acces.log | wc -l# 4grep "200" acces.log | awk '{print $6}' | sort | uniq -c | sort -rn | head -3grep "200" acces.log: Trouver toutes les lignes contenant 200
127.0.0.1 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532127.0.0.3 - - [13/May/2026] "GET /products HTTP/1.1" 200 888127.0.0.4 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200127.0.0.5 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532127.0.0.7 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532127.0.0.8 - - [13/May/2026] "GET /contact HTTP/1.1" 200 300127.0.0.9 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200127.0.0.10 - - [13/May/2026] "GET /products HTTP/1.1" 200 888awk '{print $6}': Conserver le 6e champ de chaque ligne
| 1 | 2 | 3 | 4 | 5 | 6 | 7… |
|---|---|---|---|---|---|---|
127.0.0.1 | - | - | [13/May/2026] | "GET | /index.html | … |
127.0.0.3 | - | - | [13/May/2026] | "GET | /products | … |
127.0.0.4 | - | - | [13/May/2026] | "POST | /login | … |
/index.html/products/login/index.html/index.html/contact/login/productssort: Trier par ordre alphabétique (important pour le décompte avec uniq)
/contact/index.html/index.html/index.html/login/login/products/productsuniq -c: Compter les doublons (consécutifs)
1 /contact3 /index.html2 /login2 /productssort -rn: Trier par ordre numérique décroissant (reverse)
3 /index.html2 /products2 /login1 /contacthead -3: Conserver les trois premières lignes
3 /index.html2 /products2 /logingrep "403" acces.log | awk '{print $1}' | sort -u# 172.16.0.3grep "500" acces.log | awk '{print $1}' | sort | uniq -c | sort -rn# 2 10.0.0.5Chercher
grep cherche du texte dans les fichiers.
find cherche les fichiers eux-mêmes.
L’option -r de grep et -exec de find étendent leur portée à tout un projet (dossier).
Compter et trier
wc -l compte les lignes. sort trie. uniq -c compte les occurrences.
Ensemble, sort | uniq -c | sort -rn produit un classement par fréquence.
Rediriger
> écrit dans un fichier (écrase).
>> ajoute à la fin.
2> redirige les erreurs.
2> /dev/null les ignore.
Enchaîner
Le pipe | connecte la sortie d’une commande à l’entrée de la suivante.
Chaque commande est un filtre dans une chaîne de traitement.