Aller au contenu

Recherche et filtres

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.


Commande grep : Chercher du texte dans les fichiers

Section intitulée « Commande grep : Chercher du texte dans les fichiers »

grep 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é.

Fenêtre de terminal
grep "motif" fichier

Par exemple, pour trouver toutes les erreurs dans un log :

Fenêtre de terminal
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ées

grep n’affiche que les lignes correspondantes. Tout le reste du fichier est ignoré.

OptionEffetExemple
-nAffiche le numéro de lignegrep -n "ERROR" log.txt
-iInsensible à la casse (majuscules/minuscules)grep -i "error" log.txt
-cCompte le nombre de lignes correspondantesgrep -c "404" acces.log
-rCherche récursivement dans un dossiergrep -r "TODO" src/
-vInverse le filtre (lignes qui ne contiennent PAS le motif)grep -v "INFO" erreurs.log
--includeLimite la recherche à certains types de fichiersgrep -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 :

Chercher “console.log” dans tous les fichiers JavaScript du projet

Section intitulée « Chercher “console.log” dans tous les fichiers JavaScript du projet »
Fenêtre de terminal
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);
Fenêtre de terminal
grep -rn "FIXME" .

grep cherche du texte dans les fichiers. find cherche les fichiers eux-mêmes en utilisant un critère: nom, type, taille ou date.

Fenêtre de terminal
find chemin -critère valeur
Fenêtre de terminal
find . -name "*.css"
./css/style.css
./css/navigation.css
./js/app.js
find . -name "*.js"
# ./js/validation.js
./js/app.js
./js/validation.js
CritèreEffetExemple
-name "motif"Cherche par nom (sensible à la casse)find . -name "*.html"
-iname "motif"Cherche par nom, insensible à la cassefind . -iname "readme*"
-type fSeulement les fichiersfind . -type f
-type dSeulement les dossiersfind . -type d
-maxdepth NLimite la profondeur de recherchefind . -maxdepth 1 -name "*.html"
Fenêtre de terminal
find . -type d
.
./css
./js
./img
./pages

Trouver les fichiers HTML seulement à la racine (pas dans les sous-dossiers)

Section intitulée « Trouver les fichiers HTML seulement à la racine (pas dans les sous-dossiers) »
Fenêtre de terminal
find . -maxdepth 1 -name "*.html"
./index.html

Trouver les fichiers de configuration (.env, .conf, .cfg)

Section intitulée « Trouver les fichiers de configuration (.env, .conf, .cfg) »
Fenêtre de terminal
find /etc -name "*.conf" -type f

find peut appeler une commande sur chaque fichier trouvé avec l’option -exec :

Fenêtre de terminal
find . -name "*.css" -exec wc -l {} +
26 ./css/navigation.css
63 ./css/style.css
126 total
Fenêtre de terminal
find . -name "*.sh" -exec ls -l {} +

La syntaxe est particulière :

  • {} est remplacé par le nom du fichier trouvé
  • + (ou \;) termine la commande.

Commande wc : Compter les lignes, les mots et les caractères

Section intitulée « Commande wc : Compter les lignes, les mots et les caractères »

wc (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.

Fenêtre de terminal
wc fichier.txt
# 42 186 1205 fichier.txt
# lignes mots caractères
OptionCompteExemple
-lLignes seulementwc -l acces.log
-wMots seulementwc -w article.txt
-cCaractères (octets) seulementwc -c style.css

Combien de requêtes dans le log d’accès? (1 ligne = 1 requête)

Section intitulée « Combien de requêtes dans le log d’accès? (1 ligne = 1 requête) »
Fenêtre de terminal
wc -l acces.log
26 acces.log
Fenêtre de terminal
wc -l css/*.css
26 css/navigation.css
63 css/style.css
37 css/typo.css
126 total
Fenêtre de terminal
NB_LIGNES=$(cat acces.log | wc -l)
echo "Nombre de requêtes : $NB_LIGNES"

sort prend un fichier (ou une entrée) et trie ses lignes par ordre alphabétique par défaut.

Fenêtre de terminal
cat fruits.txt
banane
cerise
abricot
datte
Fenêtre de terminal
sort fruits.txt
abricot
banane
cerise
datte
OptionEffetExemple
-rTri inversé (Z → A)sort -r fichier.txt
-nTri numérique (1, 2, 10 au lieu de 1, 10, 2)sort -n nombres.txt
-uRetire les doublons en triantsort -u fichier.txt
-k NTrie selon la N-ième colonnesort -k 2 fichier.txt

Trier un log d’accès par code de réponse HTTP (8e colonne)

Section intitulée « Trier un log d’accès par code de réponse HTTP (8e colonne) »
Fenêtre de terminal
sort -k 8 acces.log

Trier des tailles de fichiers par ordre numérique décroissant

Section intitulée « Trier des tailles de fichiers par ordre numérique décroissant »
Fenêtre de terminal
du -sh * | sort -rn
12M node_modules/
2M images/
45K index.html
8K style.css

uniq 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.

Sans sort, uniq ne voit que les doublons adjacents

Section intitulée « Sans sort, uniq ne voit que les doublons adjacents »
Fenêtre de terminal
cat visites.txt
/index.html
/produits
/index.html ← pas adjacent au premier, uniq ne le verra pas
/contact
Fenêtre de terminal
sort visites.txt | uniq
/contact
/index.html
/produits
OptionEffetExemple
-cCompte les occurrences de chaque lignesort fichier | uniq -c
-dAffiche seulement les doublonssort fichier | uniq -d

Quelles pages sont les plus visitées? Extraire les URLs, trier, compter

Section intitulée « Quelles pages sont les plus visitées? Extraire les URLs, trier, compter »
Fenêtre de terminal
cat acces.log | awk '{print $6}' | sort | uniq -c | sort -rn
# 5 /api/produits
# 3 /index.html
# 2 /api/commande
# 1 /contact
# 1 /apropos
  • awk '{print $6}' extrait la 6e colonne de chaque ligne (ici, l’URL).
  • Tu n’as pas besoin de maîtriser 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 :

FluxNuméroNomRôle
stdin0Entrée standardCe que la commande lit (par défaut : le clavier)
stdout1Sortie standardCe que la commande affiche (par défaut : l’écran)
stderr2Sortie d’erreurLes 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)

Section intitulée « > écrit dans un fichier (ÉCRASE le contenu s’il existe) »
Fenêtre de terminal
echo "Bonjour" > message.txt
cat message.txt
# Bonjour
Fenêtre de terminal
echo "Au revoir" >> message.txt
cat message.txt
# Bonjour
# Au revoir
Fenêtre de terminal
# 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 ligne
echo "Rapport du $(date +%Y-%m-%d)" > rapport.txt
echo "=============================" >> rapport.txt
echo "" >> rapport.txt
echo "Erreurs trouvées :" >> rapport.txt
grep "ERROR" serveur.log >> rapport.txt
echo "" >> rapport.txt
echo "Nombre total : $(grep -c "ERROR" serveur.log)" >> rapport.txt

Le 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 | commande3

La 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.

Fenêtre de terminal
ls | wc -l
Fenêtre de terminal
ps aux | grep "node"
Fenêtre de terminal
cat serveur.log | tail -5

Prenons grep "ERROR" serveur.log | wc -l :

  1. grep "ERROR" serveur.log lit le fichier et affiche les lignes contenant ERROR
  2. Le pipe | intercepte cette sortie (au lieu de l’afficher à l’écran)
  3. wc -l reçoit ces lignes et compte combien il y en a
  4. Le résultat final (un nombre) s’affiche à l’écran

Chaque 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 532
127.0.0.2 - - [13/May/2026] "GET /about.html HTTP/1.1" 404 210
127.0.0.3 - - [13/May/2026] "GET /products HTTP/1.1" 200 888
127.0.0.4 - - [13/May/2026] "GET /products/43 HTTP/1.1" 404 220
127.0.0.5 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200
127.0.0.6 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532
127.0.0.7 - - [13/May/2026] "GET /products HTTP/1.1" 500 100
127.0.0.8 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532
127.0.0.9 - - [13/May/2026] "GET /contact HTTP/1.1" 200 300
127.0.0.10 - - [13/May/2026] "POST /contact HTTP/1.1" 500 100
127.0.0.11 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200
127.0.0.12 - - [13/May/2026] "GET /products HTTP/1.1" 200 888
127.0.0.13 - - [13/May/2026] "GET /acceuil.html HTTP/1.1" 404 220
127.0.0.14 - - [13/May/2026] "POST /login HTTP/1.1" 400 220
127.0.0.15 - - [13/May/2026] "POST /signup HTTP/1.1" 201 100
Fenêtre de terminal
find . -name "*.js" | wc -l
# 3

Chercher les erreurs 404, afficher seulement le nombre

Section intitulée « Chercher les erreurs 404, afficher seulement le nombre »
Fenêtre de terminal
grep "404" acces.log | wc -l
# 4
Fenêtre de terminal
grep "200" acces.log | awk '{print $6}' | sort | uniq -c | sort -rn | head -3
  1. grep "200" acces.log: Trouver toutes les lignes contenant 200

    127.0.0.1 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532
    127.0.0.3 - - [13/May/2026] "GET /products HTTP/1.1" 200 888
    127.0.0.4 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200
    127.0.0.5 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532
    127.0.0.7 - - [13/May/2026] "GET /index.html HTTP/1.1" 200 532
    127.0.0.8 - - [13/May/2026] "GET /contact HTTP/1.1" 200 300
    127.0.0.9 - - [13/May/2026] "POST /login HTTP/1.1" 200 1200
    127.0.0.10 - - [13/May/2026] "GET /products HTTP/1.1" 200 888
  2. awk '{print $6}': Conserver le 6e champ de chaque ligne

    1234567…
    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
    /products
  3. sort: Trier par ordre alphabétique (important pour le décompte avec uniq)

    /contact
    /index.html
    /index.html
    /index.html
    /login
    /login
    /products
    /products
  4. uniq -c: Compter les doublons (consécutifs)

    1 /contact
    3 /index.html
    2 /login
    2 /products
  5. sort -rn: Trier par ordre numérique décroissant (reverse)

    3 /index.html
    2 /products
    2 /login
    1 /contact
  6. head -3: Conserver les trois premières lignes

    3 /index.html
    2 /products
    2 /login
Fenêtre de terminal
grep "403" acces.log | awk '{print $1}' | sort -u
# 172.16.0.3
”Quelles adresses IP ont provoqué des erreurs 500 aujourd’hui?”
Section intitulée « ”Quelles adresses IP ont provoqué des erreurs 500 aujourd’hui?” »
Fenêtre de terminal
grep "500" acces.log | awk '{print $1}' | sort | uniq -c | sort -rn
# 2 10.0.0.5


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).

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.