* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: Inter, sans-serif; background: #0a0a0f; color: #e0e0e0; min-height: 100vh; padding: 40px 20px; line-height: 1.7; }
.container { max-width: 800px; margin: 0 auto; }
.nav-top { display: flex; justify-content: space-between; align-items: center; margin-bottom: 30px; padding-bottom: 20px; border-bottom: 1px solid rgba(255,255,255,0.1); }
.nav-link { color: #00d9ff; text-decoration: none; font-size: 0.9rem; transition: opacity 0.2s; }
.nav-link:hover { opacity: 0.7; }
.nav-link.disabled { color: #555; pointer-events: none; }
.header { margin-bottom: 40px; text-align: center; }
h1 { font-size: 2.2rem; font-weight: 700; background: linear-gradient(135deg, #00d9ff, #a855f7); -webkit-background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 10px; }
.subtitle { color: #888; font-size: 1rem; }
h2 { font-size: 1.5rem; color: #00d9ff; margin: 40px 0 20px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,0.05); }
h3 { font-size: 1.15rem; color: #a855f7; margin: 25px 0 15px; }
p { margin-bottom: 15px; color: #ccc; }
strong { color: #fff; }
code { background: rgba(0,217,255,0.1); border: 1px solid rgba(0,217,255,0.2); border-radius: 4px; padding: 2px 6px; font-family: 'Courier New', monospace; font-size: 0.9em; color: #00d9ff; }
pre { background: #111; border: 1px solid rgba(255,255,255,0.1); border-radius: 8px; padding: 20px; margin: 20px 0; overflow-x: auto; }
pre code { background: none; border: none; padding: 0; display: block; line-height: 1.6; }
.table-wrapper { overflow-x: auto; margin: 20px 0; }
table { width: 100%; border-collapse: collapse; background: rgba(255,255,255,0.02); border-radius: 8px; overflow: hidden; }
th { background: rgba(0,217,255,0.15); color: #00d9ff; font-weight: 600; text-align: left; padding: 12px 15px; }
td { padding: 12px 15px; border-bottom: 1px solid rgba(255,255,255,0.05); }
tr:last-child td { border-bottom: none; }
tr:hover { background: rgba(0,217,255,0.05); }
.exercise { background: rgba(168,85,247,0.1); border: 1px solid rgba(168,85,247,0.3); border-radius: 8px; padding: 20px; margin: 25px 0; }
.exercise h3 { color: #a855f7; margin-top: 0; }
.exercise ol { margin-left: 20px; color: #ccc; }
.exercise li { margin-bottom: 10px; }
.nav-bottom { display: flex; justify-content: space-between; align-items: center; margin-top: 50px; padding-top: 20px; border-top: 1px solid rgba(255,255,255,0.1); }
.footer { text-align: center; margin-top: 40px; color: #555; font-size: 0.85rem; }
← Leçon 50 : grep, sed et xargs
Trier, dédoublonner et compter
Maîtriser trois commandes essentielles pour traiter des données textuelles : sort (trier), uniq (dédoublonner) et wc (compter).
# Trier un fichier alphabétiquement
sort fichier.txt
# Trier numériquement
sort -n nombres.txt
# Trier en ordre inverse
sort -r fichier.txt
# Trier par colonne (ex: colonne 3)
sort -k3 fichier.txt
# Supprimer les doublons pendant le tri
sort -u fichier.txt
# Trier selon un délimiteur (ex: colonne 2, délimiteur :)
sort -t: -k2 fichier.txt
# Trier numériquement avec去掉 les chaînes non-numériques
sort -V versions.txt
# Trier les processus par mémoire utilisée
ps aux | sort -k4 -rn | head -10
# Trier les fichiers par taille
ls -la | sort -k5 -rn
# Trier un fichier CSV par la colonne 3
sort -t',' -k3 usernames.csv
uniq supprime les lignes adjacentes identiques. Utile après un tri.
# Supprimer les lignes identiques consécutives
uniq fichier.txt
# Compter les occurrences de chaque ligne
uniq -c fichier.txt
# Afficher uniquement les lignes DUPLIQUÉES
uniq -d fichier.txt
# Afficher les lignes qui apparaissent une seule fois
uniq -u fichier.txt
# Supprimer TOUS les doublons (y compris non-adjacents)
sort fichier.txt | uniq
# Compter les occurrences uniques
sort fichier.txt | uniq -c | sort -rn
# Trouver les 10 mots les plus fréquents
cat words.txt | sort | uniq -c | sort -rn | head -10
wc (word count) compte les lignes, mots et caractères.
# Compter les lignes
wc -l fichier.txt
# Compter les mots
wc -w fichier.txt
# Compter les caractères
wc -c fichier.txt
# Tout afficher (lignes, mots, caractères, fichier)
wc fichier.txt
# Compter le nombre de fichiers dans un répertoire
ls -1 | wc -l
# Compter les lignes de code dans un projet
find . -name "*.py" -exec cat {} \; | wc -l
# Compter le nombre d'utilisateurs
cat /etc/passwd | wc -l
# Compter les lignes dans plusieurs fichiers
wc -l *.log
# Trouver les 5 IP les plus fréquentes dans les logs
cat /var/log/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -5
# Lister les utilisateurs uniques connectés
who | awk '{print $1}' | sort | uniq
# Compter les lignes de chaque type d'erreur
grep "ERROR" app.log | wc -l
# Analyser les connexions SSH
last | awk '{print $1}' | sort | uniq -c | sort -rn
/etc/passwd par ordre alphabétique des noms d'utilisateurs./var/log/syslog, compte combien de fois chaque programme apparaît.last ou les logs SSH).| Commande | Rôle | Exemple |
|---|---|---|
sort | Trier les lignes | sort -n fichier.txt |
sort -r | Trier en ordre inverse | sort -r liste.txt |
sort -u | Trier et dédoublonner | sort -u fichier.txt |
sort -k | Trier par colonne | sort -k3 -t: fichier.txt |
uniq | Supprimer les doublons | sort fichier | uniq |
uniq -c | Compter les occurrences | uniq -c fichier.txt |
uniq -d | Afficher les doublons | uniq -d fichier.txt |
wc -l | Compter les lignes | wc -l *.log |
wc -w | Compter les mots | wc -w document.txt |