Aller au contenu principal

Recherche avancée


Table des matières

  1. find : recherche avancée
  2. locate et updatedb
  3. grep avancé et regex
  4. Introduction à awk
  5. Introduction à sed
  6. Exercices pratiques


1 - find : recherche avancée

Syntaxe

find [chemin] [critères] [actions]

Recherche par nom

# Nom exact
find /home -name "document.txt"

# Pattern (insensible à la casse)
find /home -iname "*.txt"

# Regex
find /var -regex ".*\.log$"

Recherche par type

# Fichiers uniquement
find /var -type f

# Répertoires uniquement
find /home -type d

# Liens symboliques
find /etc -type l
TypeDescription
fFichier
dRépertoire
lLien symbolique
bBloc (device)
cCaractère (device)

Recherche par taille

# Plus de 100 Mo
find / -type f -size +100M

# Moins de 1 Ko
find /tmp -type f -size -1k

# Exactement 10 Mo
find /home -type f -size 10M

# Entre 10 et 100 Mo
find / -type f -size +10M -size -100M

Recherche par temps

# Modifiés dans les dernières 24h
find /var/log -type f -mtime -1

# Plus de 30 jours
find /tmp -type f -mtime +30

# Accédés dans les 7 derniers jours
find /home -type f -atime -7

# Modifiés dans les 60 dernières minutes
find /var/log -type f -mmin -60
OptionDescription
-mtimeModification (jours)
-atimeAccès (jours)
-ctimeChangement inode (jours)
-mminModification (minutes)

Recherche par permissions

# Permissions exactes
find / -type f -perm 777

# Au moins ces permissions
find / -type f -perm -644

# SUID activé
find / -type f -perm -4000

# Fichiers world-writable
find / -type f -perm -o=w

Recherche par propriétaire

# Par utilisateur
find /home -user john

# Par groupe
find /var -group www-data

# Sans propriétaire
find / -nouser

Actions

# Exécuter une commande
find /tmp -name "*.tmp" -exec rm {} \;

# Exécuter avec confirmation
find /var/log -name "*.log" -ok rm {} \;

# Afficher avec détails
find /home -type f -ls

# Supprimer directement
find /tmp -type f -mtime +7 -delete

# xargs pour efficacité
find /home -name "*.txt" -print0 | xargs -0 grep "pattern"

Combinaisons

# ET (par défaut)
find /var -type f -name "*.log" -size +10M

# OU
find /home \( -name "*.jpg" -o -name "*.png" \)

# NON
find /etc -type f ! -name "*.conf"

🔝 Retour à la table des matières



2 - locate et updatedb

locate - Recherche rapide

locate utilise une base de données pré-indexée.

# Installer
sudo apt install mlocate

# Rechercher
locate config.txt
locate -i README # Insensible à la casse
locate -c "*.log" # Compter

# Limiter les résultats
locate -l 10 passwd

updatedb - Mettre à jour l'index

# Mise à jour manuelle
sudo updatedb

# La mise à jour se fait automatiquement via cron
cat /etc/cron.daily/mlocate

Comparaison find vs locate

Aspectfindlocate
VitesseLent (temps réel)Rapide (base de données)
ActualitéToujours à jourPeut être obsolète
CritèresTrès flexiblesNom seulement
UsageRecherches complexesRecherches rapides par nom

🔝 Retour à la table des matières



3 - grep avancé et regex

Options avancées de grep

# Récursif dans les dossiers
grep -r "error" /var/log/

# Avec numéro de ligne
grep -n "error" fichier.log

# Contexte (lignes avant/après)
grep -B 2 -A 2 "error" fichier.log
grep -C 3 "error" fichier.log

# Compter
grep -c "error" fichier.log

# Fichiers correspondants seulement
grep -l "error" *.log

# Inverser (lignes NE contenant PAS)
grep -v "debug" fichier.log

# Plusieurs patterns
grep -E "error|warning|critical" fichier.log

Expressions régulières de base

PatternSignification
.N'importe quel caractère
^Début de ligne
$Fin de ligne
*0 ou plus du caractère précédent
+1 ou plus (avec -E)
?0 ou 1 (avec -E)
[]Classe de caractères
[^]Négation de classe
\Échappement

Exemples de regex

# Lignes commençant par "Error"
grep "^Error" fichier.log

# Lignes terminant par un chiffre
grep "[0-9]$" fichier.log

# Adresses IP (simplifié)
grep -E "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log

# Emails (simplifié)
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" fichier

# Dates au format YYYY-MM-DD
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" fichier

# Mots de 5 lettres exactement
grep -E "\b[a-zA-Z]{5}\b" fichier

🔝 Retour à la table des matières



4 - Introduction à awk

Qu'est-ce que awk ?

awk est un langage de traitement de texte orienté colonnes.

Structure

awk 'condition { action }' fichier

Traitement de colonnes

# Afficher la première colonne
awk '{print $1}' fichier.txt

# Afficher plusieurs colonnes
awk '{print $1, $3}' fichier.txt

# Dernière colonne
awk '{print $NF}' fichier.txt

# Nombre de colonnes
awk '{print NF}' fichier.txt

Variables spéciales

VariableDescription
$0Ligne entière
$1, $2...Colonnes 1, 2...
$NFDernière colonne
NRNuméro de ligne
NFNombre de champs
FSSéparateur d'entrée
OFSSéparateur de sortie

Changer le séparateur

# Fichier CSV (séparateur virgule)
awk -F',' '{print $1, $2}' fichier.csv

# Fichier /etc/passwd (séparateur :)
awk -F':' '{print $1, $3}' /etc/passwd

Conditions

# Lignes où colonne 3 > 100
awk '$3 > 100 {print}' fichier.txt

# Lignes contenant "error"
awk '/error/ {print}' fichier.log

# Lignes 10 à 20
awk 'NR >= 10 && NR <= 20' fichier.txt

Calculs

# Somme d'une colonne
awk '{sum += $3} END {print sum}' fichier.txt

# Moyenne
awk '{sum += $3; count++} END {print sum/count}' fichier.txt

# Maximum
awk 'BEGIN {max=0} $3>max {max=$3} END {print max}' fichier.txt

Exemples pratiques

# Top 5 IPs dans access.log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5

# Utilisateurs avec UID > 1000
awk -F':' '$3 >= 1000 {print $1}' /etc/passwd

# Taille totale des fichiers
ls -l | awk '{total += $5} END {print total/1024/1024 " Mo"}'

🔝 Retour à la table des matières



5 - Introduction à sed

Qu'est-ce que sed ?

sed (Stream EDitor) modifie du texte ligne par ligne.

Substitution

# Remplacer première occurrence par ligne
sed 's/ancien/nouveau/' fichier.txt

# Remplacer toutes les occurrences
sed 's/ancien/nouveau/g' fichier.txt

# Insensible à la casse
sed 's/ancien/nouveau/gi' fichier.txt

# Modifier le fichier en place
sed -i 's/ancien/nouveau/g' fichier.txt

# Avec backup
sed -i.bak 's/ancien/nouveau/g' fichier.txt

Supprimer des lignes

# Supprimer une ligne spécifique
sed '5d' fichier.txt

# Supprimer les lignes 5 à 10
sed '5,10d' fichier.txt

# Supprimer les lignes contenant un pattern
sed '/pattern/d' fichier.txt

# Supprimer les lignes vides
sed '/^$/d' fichier.txt

Afficher des lignes

# Afficher uniquement les lignes 5 à 10
sed -n '5,10p' fichier.txt

# Afficher les lignes contenant un pattern
sed -n '/error/p' fichier.txt

Insérer du texte

# Insérer avant la ligne 3
sed '3i\Nouvelle ligne' fichier.txt

# Ajouter après la ligne 3
sed '3a\Nouvelle ligne' fichier.txt

# Ajouter à la fin de chaque ligne
sed 's/$/ FIN/' fichier.txt

# Ajouter au début de chaque ligne
sed 's/^/DEBUT /' fichier.txt

Exemples pratiques

# Remplacer dans plusieurs fichiers
sed -i 's/localhost/192.168.1.100/g' *.conf

# Supprimer les commentaires
sed '/^#/d' fichier.conf

# Supprimer les espaces en fin de ligne
sed 's/[[:space:]]*$//' fichier.txt

# Convertir dos2unix
sed -i 's/\r$//' fichier.txt

🔝 Retour à la table des matières



6 - Exercices pratiques

Exercice 1 : find

# 1. Trouvez tous les fichiers .conf dans /etc
find /etc -name "*.conf" -type f 2>/dev/null | head -10

# 2. Trouvez les fichiers > 10Mo dans /var
sudo find /var -type f -size +10M 2>/dev/null

# 3. Trouvez les fichiers modifiés aujourd'hui
find /home -type f -mtime 0 2>/dev/null

Exercice 2 : grep et regex

# 1. Créez un fichier de test
cat << 'EOF' > test_grep.txt
Error: connection failed
Warning: low memory
Info: process started
ERROR: disk full
error: timeout
EOF

# 2. Trouvez toutes les erreurs (insensible à la casse)
grep -i "error" test_grep.txt

# 3. Comptez les erreurs
grep -ci "error" test_grep.txt

# 4. Nettoyez
rm test_grep.txt

Exercice 3 : awk

# Analysez /etc/passwd
# 1. Affichez nom:home de chaque utilisateur
awk -F':' '{print $1 ":" $6}' /etc/passwd

# 2. Comptez les utilisateurs avec shell /bin/bash
awk -F':' '$7 == "/bin/bash"' /etc/passwd | wc -l

Quiz

Q1. Comment trouver les fichiers de plus de 100 Mo ?

Réponse

find / -type f -size +100M

Q2. Comment afficher la 3e colonne avec awk ?

Réponse

awk '{print $3}' fichier

Q3. Comment remplacer "foo" par "bar" dans tous les fichiers .txt ?

Réponse

sed -i 's/foo/bar/g' *.txt

🔝 Retour à la table des matières



Points clés à retenir

  • find = recherche en temps réel, très flexible
  • locate = recherche rapide par nom (base indexée)
  • grep -E pour les regex étendues
  • awk = traitement de colonnes ($1, $2, $NF)
  • sed = substitution (s/ancien/nouveau/g)
  • Option -i de sed modifie en place
  • Toujours tester avant d'utiliser -i !

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Exercices récapitulatifs →