15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer
10.11.2023

Comment trouver un fichier par contenu sous Linux : grep, find et awk expliqués

Rechercher un fichier par son contenu sous Linux signifie analyser les données des fichiers — pas seulement les noms de fichiers ou les métadonnées — en utilisant des outils comme grep, find et awk pour faire correspondre des motifs de texte, des chaînes ou des expressions régulières dans un ou plusieurs fichiers simultanément. C’est fondamentalement différent des recherches basées sur les noms et c’est la bonne approche lorsque vous savez ce qu’un fichier *contient* mais pas où il se trouve ou comment il s’appelle.

Pour toute personne gérant un environnement VPS Hosting, la recherche de fichiers par contenu est une nécessité opérationnelle quotidienne : localiser des directives mal configurées dans /etc, auditer les fichiers journaux pour détecter des patterns d’erreurs, ou traquer des identifiants codés en dur dans les arborescences de code source des applications. Les commandes présentées dans ce guide fonctionnent de manière identique sur toutes les principales distributions Linux — Debian, Ubuntu, CentOS, AlmaLinux et Arch — sans nécessiter de paquets supplémentaires.

Pourquoi la recherche par contenu est importante dans les environnements Linux

Les recherches basées sur les noms de fichiers (ls, locate) ne vous disent rien sur ce que contient un fichier. Dans les systèmes en production, les questions critiques sont presque toujours liées au contenu :

  • Quel fichier de configuration définit max_connections à une valeur spécifique ?
  • Quel fichier PHP contient un appel de fonction obsolète qui génère des avertissements ?
  • Quel fichier journal a enregistré une adresse IP spécifique à un horodatage donné ?
  • Quelle définition de tâche cron fait référence à un chemin de script désormais supprimé ?

Les gestionnaires de fichiers modernes et les outils de recherche graphiques ne peuvent pas répondre efficacement à ces questions à grande échelle. La ligne de commande Linux le peut — et le fait en quelques millisecondes sur des millions de fichiers lorsqu’elle est utilisée correctement.

La commande grep : outil principal pour la recherche de contenu

grep (Global Regular Expression Print) est l’outil de référence pour rechercher du contenu dans des fichiers sous Linux. Il lit les fichiers ligne par ligne et affiche toute ligne correspondant à un motif donné.

Syntaxe de base

grep [OPTIONS] PATTERN [FILE_OR_DIRECTORY]

Recherche récursive dans les répertoires

L’utilisation la plus courante en situation réelle est une recherche récursive dans toute une arborescence de répertoires :

grep -rnw '/path/to/directory/' -e 'search_text'

Détail de chaque option :

OptionNom completEffet
-r--recursiveDescend automatiquement dans les sous-répertoires
-n--line-numberPréfixe le numéro de la ligne correspondante dans la sortie
-w--word-regexpCorrespond uniquement aux mots entiers — test ne correspondra pas à testing
-e--regexpDéclare explicitement le motif de recherche ; requis lorsque le motif commence par un tiret
-i--ignore-caseCorrespondance insensible à la casse (Error correspond à error, ERROR)
-l--files-with-matchesAffiche uniquement les noms de fichiers, pas les lignes correspondantes
-c--countAffiche uniquement le nombre de lignes correspondantes par fichier
-v--invert-matchRetourne les lignes qui ne correspondent PAS au motif
-A N--after-context=NAffiche N lignes après chaque correspondance pour le contexte
-B N--before-context=NAffiche N lignes avant chaque correspondance pour le contexte
--includeN/ARestreint la recherche aux fichiers correspondant à un motif glob
--excludeN/AIgnore les fichiers correspondant à un motif glob

Exemples pratiques de grep

Rechercher la chaîne « test1 » dans /usr/games et tous les sous-répertoires :

grep -r "test1" /usr/games

Trouver tous les fichiers sous /etc contenant le mot « network » (mot entier, insensible à la casse), en affichant les numéros de ligne :

grep -rniw "network" /etc

Lister uniquement les noms de fichiers (pas les lignes correspondantes) des fichiers PHP contenant eval( :

grep -rl "eval(" /var/www/html --include="*.php"

Rechercher un motif et afficher 3 lignes de contexte avant et après chaque correspondance :

grep -rn -A 3 -B 3 "FATAL" /var/log/

Compter combien de fois « PermitRootLogin » apparaît dans tous les fichiers de configuration SSH :

grep -rc "PermitRootLogin" /etc/ssh/

Trouver les lignes qui ne contiennent PAS « localhost » dans un fichier hosts :

grep -v "localhost" /etc/hosts

grep avec les expressions régulières

grep prend en charge trois moteurs regex :

  • BRE (Expressions régulières de base) — mode par défaut
  • ERE (Expressions régulières étendues) — activé avec -E ou egrep
  • PCRE (Expressions régulières compatibles Perl) — activé avec -P
# Match lines containing an IPv4 address pattern (ERE)
grep -rE '([0-9]{1,3}.){3}[0-9]{1,3}' /var/log/nginx/access.log

# Match lines with email addresses (PCRE)
grep -rP '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}' /var/www/html/

Cas limites critiques et pièges avec grep

Fichiers binaires : Par défaut, grep affichera Binary file X matches pour les fichiers binaires et ignorera leur contenu. Utilisez -a (--text) pour forcer grep à traiter les fichiers binaires comme du texte — utile lors de la recherche dans des configurations compilées ou des dumps de base de données. À utiliser avec précaution sur les gros fichiers binaires.

Liens symboliques : -r ne suit pas les liens symboliques. Utilisez -R (R majuscule) pour suivre les liens symboliques de manière récursive. Sachez que cela peut créer des boucles infinies si des liens symboliques circulaires existent.

Performance sur de grandes arborescences : grep est mono-thread par défaut. Pour les bases de code massives (millions de fichiers), envisagez ripgrep (rg) ou ag (The Silver Searcher), qui sont multi-threads et respectent automatiquement les motifs .gitignore.

Octets nuls dans les noms de fichiers : Redirigez la sortie de find avec -print0 et utilisez grep --null ou xargs -0 pour gérer en toute sécurité les noms de fichiers contenant des espaces ou des caractères spéciaux.

Problèmes d’encodage : grep opère sur des octets, pas sur des caractères. Si les fichiers utilisent UTF-16 ou d’autres encodages, les résultats peuvent être peu fiables. Définissez LANG=C ou LC_ALL=C avant la commande pour forcer la correspondance au niveau des octets :

LC_ALL=C grep -r "pattern" /path/

La commande find : combiner les métadonnées de fichiers et la recherche de contenu

Alors que grep recherche *dans* les fichiers, find localise les fichiers en fonction de leurs métadonnées — nom, type, taille, permissions, date de modification — et peut ensuite exécuter des commandes arbitraires sur chaque résultat. Combiner find avec grep vous offre des recherches de contenu précises et multi-critères.

Syntaxe de base

find /starting/path [CRITERIA] [ACTION]

Recherche de contenu avec find + grep

find /path/to/directory/ -type f -exec grep -l 'search_text' {} ;

Anatomie de cette commande :

ComposantSignification
/path/to/directory/Répertoire racine pour la recherche
-type fRestreint les résultats aux fichiers réguliers uniquement (exclut les répertoires, sockets, périphériques)
-exec ... {} ;Exécute la commande spécifiée une fois par fichier trouvé ; {} est remplacé par le nom du fichier
grep -lAffiche uniquement le nom du fichier si une correspondance est trouvée, pas la ligne correspondante

Combiner les critères de find pour plus de précision

La véritable puissance de find réside dans la combinaison de plusieurs critères avant d’exécuter grep, réduisant considérablement le nombre de fichiers à analyser :

Rechercher uniquement les fichiers .conf modifiés au cours des 7 derniers jours :

find /etc -type f -name "*.conf" -mtime -7 -exec grep -l "timeout" {} ;

Rechercher uniquement les fichiers de plus de 1MB :

find /var/log -type f -size +1M -exec grep -c "ERROR" {} ;

Rechercher les fichiers appartenant à un utilisateur spécifique :

find /home -type f -user john -exec grep -l "password" {} ;

Rechercher les fichiers avec des permissions spécifiques (accessibles en écriture par tous) :

find /var/www -type f -perm -o+w -exec grep -l "eval(" {} ;

Exclure un répertoire de la recherche :

find /var/www -type f -not -path "*/node_modules/*" -exec grep -l "API_KEY" {} ;

Utiliser find avec xargs pour de meilleures performances

La syntaxe -exec ... ; crée un nouveau processus pour chaque fichier trouvé. Sur des répertoires contenant des milliers de fichiers, c’est sensiblement plus lent. Utiliser xargs regroupe plusieurs noms de fichiers en une seule invocation de grep :

find /path/ -type f -name "*.log" -print0 | xargs -0 grep -l "connection refused"

Les options -print0 et -0 utilisent des caractères nuls comme délimiteurs au lieu des sauts de ligne, gérant correctement les noms de fichiers contenant des espaces.

La commande awk : recherche et extraction de contenu structuré

awk est un langage complet de traitement de texte, pas seulement un outil de recherche. Il excelle lorsque vous devez rechercher des motifs dans des fichiers structurés — données CSV, fichiers journaux à colonnes fixes, fichiers de configuration — et simultanément extraire, transformer ou calculer à partir des données correspondantes.

Syntaxe de base

awk '/pattern/ { action }' file

Exemples pratiques de awk pour la recherche de contenu dans les fichiers

Afficher toutes les lignes d’un fichier contenant le mot « error » :

awk '/error/' /var/log/syslog

Rechercher un motif et afficher uniquement des champs spécifiques (colonne 1 et colonne 5) :

awk '/FAILED/ { print $1, $5 }' /var/log/auth.log

Rechercher dans plusieurs fichiers et afficher le nom du fichier avec les lignes correspondantes :

awk '/search_term/ { print FILENAME": "$0 }' /etc/nginx/*.conf

Recherche insensible à la casse avec awk :

awk 'tolower($0) ~ /timeout/' /etc/mysql/my.cnf

Compter les occurrences d’un motif par fichier :

awk '/ERROR/ { count++ } END { print FILENAME, count }' /var/log/app.log

Quand utiliser awk plutôt que grep

awk est le meilleur choix lorsque :

  • Vous devez filtrer par valeur de colonne (par exemple, « trouver les lignes où le champ 3 est supérieur à 500 »)
  • Vous devez effectuer des calculs arithmétiques sur les données correspondantes
  • Vous devez agréger des résultats (comptages, sommes) dans un fichier
  • Le fichier a un délimiteur cohérent et vous avez besoin d’une extraction structurée

grep reste plus rapide pour les tâches de correspondance de motifs purs où vous avez seulement besoin de savoir *si* et *où* un motif existe.

Comparaison des outils : grep vs find vs awk

Critèregrepfind + grepawk
Objectif principalCorrespondance de motifs dans le contenuRecherche de contenu filtrée par métadonnéesTraitement de données structurées
Recherche récursiveOui (-r / -R)Oui (natif)Non (nécessite une boucle shell)
Filtrage par métadonnéesNonOui (nom, taille, date, propriétaire)Non
Support des expressions régulièresBRE, ERE, PCREVia grepERE
Formatage de la sortieLimitéLimitéContrôle programmable complet
Performance sur de grandes arborescencesRapidePlus lent (un processus par fichier)Modéré
Courbe d’apprentissageFaibleMoyenneÉlevée
Meilleur cas d’utilisationRecherche rapide de mots-clésAudits de production multi-critèresAnalyse de journaux, extraction de données

Techniques avancées pour les environnements de production

Recherche dans les fichiers journaux compressés

Sur les serveurs où les journaux sont archivés et compressés, utilisez zgrep pour rechercher dans les fichiers .gz sans les décompresser au préalable :

zgrep "segfault" /var/log/syslog.*.gz

Recherche dans les archives tar sans extraction

tar -xOf archive.tar.gz | grep "search_pattern"

Combiner grep avec sort et uniq pour l’analyse de fréquence

Trouver les messages d’erreur les plus fréquents dans un fichier journal :

grep "ERROR" /var/log/app.log | sort | uniq -c | sort -rn | head -20

Exclure les fichiers binaires et se concentrer sur le code source

grep -r --include="*.py" --include="*.js" --include="*.php" "TODO" /var/www/

Surveillance du contenu en temps réel avec grep

Redirigez tail -f vers grep pour surveiller la sortie des journaux en direct pour des motifs spécifiques :

tail -f /var/log/nginx/error.log | grep --line-buffered "upstream"

L’option --line-buffered force grep à vider la sortie après chaque ligne, ce qui est essentiel lors de la redirection depuis un flux continu.

Cas d’utilisation pour l’audit de sécurité

La recherche de fichiers par contenu est une technique fondamentale dans le durcissement de la sécurité Linux. Sur un Serveur Dédié ou un VPS, ces patterns sont essentiels sur le plan opérationnel :

Analyser les mots de passe codés en dur dans les fichiers d’application web :

grep -rniE "(password|passwd|pwd)s*=s*['"][^'"]{3,}" /var/www/ --include="*.php"

Trouver les fichiers de clés privées lisibles par tous :

find / -name "*.pem" -o -name "*.key" | xargs grep -l "PRIVATE KEY"

Détecter les webshells PHP en analysant les combinaisons de fonctions shell courantes :

grep -rPl "evals*(s*(base64_decode|gzinflate|str_rot13)" /var/www/

Auditer les fichiers SSH authorized_keys pour tous les utilisateurs :

find /home -name "authorized_keys" -exec grep -H "." {} ;

Lors de l’utilisation d’un VPS avec cPanel, ces audits sont particulièrement importants car les environnements cPanel hébergent plusieurs comptes et une compromission de l’un peut affecter les autres.

Optimisation des performances pour les recherches à grande échelle

Limiter la profondeur de recherche pour éviter de parcourir inutilement des arborescences de répertoires profondes :

find /var/www -maxdepth 3 -type f -name "*.php" -exec grep -l "eval(" {} ;

Utiliser ripgrep pour les tâches critiques en termes de vitesse. Bien que non couvert en détail ici, rg est 3 à 10 fois plus rapide que grep sur les grandes bases de code grâce au parallélisme et à un filtrage de fichiers plus intelligent. Il est disponible dans la plupart des dépôts de distributions :

apt install ripgrep   # Debian/Ubuntu
yum install ripgrep   # CentOS/RHEL

Profiler votre recherche avec time pour comparer différentes approches :

time grep -r "pattern" /large/directory/

Éviter de rechercher dans /proc et /sys — ces systèmes de fichiers virtuels peuvent provoquer des blocages ou produire des résultats sans signification :

grep -r --exclude-dir={proc,sys,dev} "pattern" /

Choisir la bonne approche : matrice de décision

ScénarioCommande recommandée
Recherche rapide de mots-clés dans un répertoiregrep -rn "keyword" /path/
Recherche de mots entiers insensible à la cassegrep -rniw "keyword" /path/
Rechercher uniquement des types de fichiers spécifiquesgrep -r --include="*.conf" "keyword" /path/
Rechercher des fichiers modifiés récemmentfind /path -mtime -1 -exec grep -l "keyword" {} ;
Rechercher efficacement dans de grandes arborescences`find /path -print0xargs -0 grep -l "keyword"`
Extraire des données structurées des journauxawk '/pattern/ { print $1, $NF }' logfile
Rechercher dans des journaux compressészgrep "keyword" /var/log/*.gz
Surveillance des journaux en temps réel`tail -f /var/log/file.loggrep –line-buffered "pattern"`
Audit de sécurité pour les chaînes sensiblesgrep -rPl "eval(base64_decode" /var/www/

Points techniques clés à retenir

  • Utilisez grep -rniw comme recherche récursive par défaut — il gère la casse, les mots entiers et les numéros de ligne en une seule passe.
  • Utilisez toujours -print0 avec find et -0 avec xargs pour gérer les noms de fichiers contenant des espaces ou des caractères spéciaux.
  • Utilisez -exec grep ... {} + (signe plus au lieu du point-virgule) pour regrouper plusieurs fichiers par invocation de grep et réduire la surcharge de processus.
  • grep -R (R majuscule) suit les liens symboliques ; grep -r ne le fait pas — sachez quel comportement votre environnement requiert.
  • Définissez LC_ALL=C avant grep dans les scripts pour éviter les pénalités de performance liées aux paramètres régionaux et les surprises d’encodage.
  • Restreignez les recherches en utilisant --include et --exclude-dir pour éliminer les fichiers non pertinents avant que la correspondance de motifs ne commence.
  • Pour les environnements d’hébergement multi-comptes gérés via des Panneaux de contrôle VPS, planifiez des audits de contenu en tant que tâches cron en utilisant ces commandes pour automatiser les vérifications de sécurité.
  • Dans les environnements d’Hébergement Web Mutualisé, les permissions de recherche de contenu peuvent être restreintes par le fournisseur d’hébergement — utilisez ces commandes uniquement dans l’arborescence de fichiers de votre propre compte.

Foire aux questions

Quelle est la façon la plus rapide de rechercher du texte dans tous les fichiers d’un serveur Linux ?

Pour la vitesse sur de grandes arborescences de fichiers, utilisez grep -r --include="*.ext" "pattern" /path/ avec des restrictions de type de fichier, ou installez ripgrep (rg "pattern" /path/) qui utilise le multi-threading et est généralement 3 à 10 fois plus rapide que grep standard sur les grandes bases de code.

Comment rechercher une chaîne dans des fichiers en excluant certains répertoires ?

Utilisez l’option --exclude-dir de grep : grep -r --exclude-dir={.git,node_modules,vendor} "pattern" /path/. Pour les recherches basées sur find, utilisez -not -path "*/dirname/*" avant la clause -exec.

Quelle est la différence entre grep -r et grep -R ?

grep -r effectue une recherche récursive mais ne suit pas les liens symboliques. grep -R effectue la même recherche récursive et suit également les liens symboliques. Utilisez -R uniquement lorsque vous êtes certain qu’aucun lien symbolique circulaire n’existe dans l’arborescence de répertoires cible.

Puis-je rechercher du contenu dans des fichiers journaux .gz compressés sans les décompresser ?

Oui. Utilisez zgrep "pattern" /var/log/file.log.gz pour les fichiers individuels, ou zgrep "pattern" /var/log/*.gz pour plusieurs fichiers compressés. Le format de sortie est identique à celui de grep standard.

Comment rechercher un motif multi-ligne dans des fichiers Linux ?

grep standard fait la correspondance ligne par ligne et ne peut pas nativement faire correspondre des motifs s’étendant sur plusieurs lignes. Utilisez grep -P avec des regex compatibles Perl et n pour les sauts de ligne, ou utilisez pcregrep -M "line1nline2" file si pcregrep est disponible. Pour une extraction multi-ligne complexe, awk avec la redéfinition de RS (séparateur d’enregistrements) est souvent la solution la plus lisible.

15%

Économisez 15% sur tous les services d'hébergement

Testez vos compétences et obtenez Réduction sur tout plan d'hébergement

Utilisez le code :

Skills
Commencer