Système d’exploitation et mise en œuvre UNIX
Ce laboratoire présente les commandes fondamentales de manipulation de flux et de texte sous UNIX. Il couvre les entrées/sorties standard, les filtres, les redirections, les expressions régulières, ainsi que les commandes sort, uniq, wc, tr, sed et awk.
D'après le document Système d’exploitation et mise en œuvre UNIX
Cet article a été rédigé automatiquement à partir du document source, puis vérifié avant publication.

Document source
Operating Systems, UNIX · PDF · 12 pages · 2010
Afficher l'aperçu du document
Ce laboratoire présente les commandes fondamentales de manipulation de flux et de texte sous UNIX. Il couvre les entrées/sorties standard, les filtres, les redirections, les expressions régulières, ainsi que les commandes sort, uniq, wc, tr, sed et awk. Ce TP permet d’apprendre à traiter des fichiers et des flux de données en ligne de commande, en utilisant des outils puissants pour trier, filtrer, transformer et analyser du texte. Pour réaliser ce TP, un système UNIX ou Linux avec un terminal et les commandes mentionnées est nécessaire.
Objectifs
- Comprendre les concepts d’entrée standard (stdin), sortie standard (stdout) et sortie d’erreur (stderr).
- Maîtriser les redirections et les filtres sous UNIX.
- Utiliser les expressions régulières pour rechercher et manipuler du texte.
- Appliquer les commandes sort, uniq, wc, tr, sed et awk pour traiter des fichiers texte.
- Écrire des scripts simples avec sed et awk pour automatiser des transformations.
Prérequis et installation
- Un système UNIX ou Linux avec un shell (bash, sh, etc.).
- Les commandes suivantes doivent être disponibles : sort, uniq, wc, tr, sed, awk.
- Connaissances de base en ligne de commande UNIX.
- Notions élémentaires d’expressions régulières.
Entrées/Sorties standard sous UNIX
Unix définit trois flux standards :
- stdin (descripteur 0) : entrée standard, par défaut le clavier.
- stdout (descripteur 1) : sortie standard, par défaut l’écran.
- stderr (descripteur 2) : sortie d’erreur, par défaut l’écran.
Ces flux peuvent être redirigés pour modifier la source ou la destination des données.
Filtres et redirections
Les redirections permettent de modifier les flux d’entrée et de sortie :
Cmd > File: redirige la sortie standard vers un fichier (écrase si existe).Cmd >> File: ajoute la sortie standard à la fin d’un fichier.Cmd < File: prend l’entrée standard depuis un fichier.Cmd << "fin": lit depuis stdin jusqu’à la chaîne "fin".Cmd 2> File: redirige la sortie d’erreur vers un fichier (écrase).Cmd 2>> File: ajoute la sortie d’erreur à un fichier.Cmd1 | Cmd2: pipe, la sortie de Cmd1 devient l’entrée de Cmd2./dev/null: fichier spécial qui supprime toute donnée écrite.
Exemple : cmd > /dev/null supprime toute sortie de la commande.
Expressions régulières
Les expressions régulières (regex) servent à représenter des motifs dans des chaînes de caractères :
c: caractère c (non méta-caractère).\c: caractère littéral c si c est un méta-caractère..: un caractère quelconque (y compris saut de ligne).[abc]: un caractère parmi a, b ou c.[^abc]: un caractère qui n’est pas a, b ou c.M-R: plage de caractères de M à R.
Les quantificateurs :
*: zéro ou plusieurs fois.+: une ou plusieurs fois.?: zéro ou une fois.\{n\}: exactement n fois.\{n,\}: au moins n fois.\{,m\}: au plus m fois.\{n,m\}: entre n et m fois.
Positions :
^: début de ligne.$: fin de ligne.\<: début de mot.\>: fin de mot.
Groupements :
exp1 exp2: exp1 suivi de exp2.exp1 | exp2: exp1 ou exp2.(exp): groupe l’expression exp.\n: référence à la nième sous-expression capturée.
Exemples :
[0-9]+: un entier (un ou plusieurs chiffres).[^aeyuio]: un caractère non voyelle.0x[0-9a-fA-F]+: un nombre hexadécimal.[1-9][0-9]\{3\}: un entier à quatre chiffres ne commençant pas par 0.[A-Z][a-z]*: un mot commençant par une majuscule.([A-Z]+)|([a-z]+): un mot entièrement en majuscules ou en minuscules.\<loin\.\.$: une ligne se terminant par un point.^toto$: la chaîne « toto » seule sur une ligne.
Commande sort
La commande sort trie les lignes d’un fichier ou d’un flux par ordre croissant.
Options principales :
-n: tri numérique (utiliser-gpour les réels).-r: inverse l’ordre du tri.-f: ignore la casse (majuscule/minuscule).-t c: utilise le caractère c comme séparateur de champs (par défaut espace).-k fields: tri selon le ou les champs spécifiés.
Sélection de champs :
n: tri selon le nième champ.n,m: tri selon les champs du n-ième au m-ième.n.m: tri selon le m-ième caractère du nième champ.
Exemple :
Ligne à trier :
Toto titi ta:ta
Sans option -t, trois champs :
- Toto
- titi
- ta:ta
Avec -t : (séparateur « : »), deux champs :
- Toto titi ta
- ta
Avec -k 2,2, tri selon le 2ème champ (ici « titi »).
Avec -k 2.2, tri à partir du 2ème caractère du 2ème champ.
Commande uniq
uniq filtre les lignes répétées consécutivement dans un flux trié.
Options :
- Sans option : affiche les lignes en supprimant les doublons consécutifs.
-u: affiche uniquement les lignes uniques.-c: affiche le nombre d’occurrences de chaque ligne.-d: affiche uniquement les lignes répétées.-f n: ignore les n premiers champs lors de la comparaison.-i: ignore la casse.
Exemple avec un fichier toto :
1
1
1
2
2
3
Commande uniq toto :
1
2
3
Commande uniq -d toto :
1
2
Commande uniq -c toto :
3 1
2 2
1 3
Commande wc
wc compte le nombre de lignes, mots ou caractères dans un fichier.
Options :
- Sans option : affiche lignes, mots et caractères.
-l: nombre de lignes.-w: nombre de mots (séparés par espaces).-c: nombre de caractères.
Exemple avec un fichier toto contenant :
aaabbcc cccbbaaa
Commande :
wc toto
Affiche :
1 2 17 toto
Commande tr
tr remplace ou supprime des caractères dans un flux. Il lit uniquement sur stdin.
Options :
Table TableFin: remplace caractère par caractère de Table par ceux de TableFin.-d table: supprime tous les caractères contenus dans table.-s table: supprime les occurrences multiples consécutives des caractères de table.-c table: inverse la table (caractères non contenus dans table).
Les tables de caractères peuvent utiliser :
A-F: caractères de A à F.A*4: caractère A répété 4 fois.A*: caractère A répété autant que nécessaire.
Exemples :
% cat toto
aaabbcc cccbbaaa
% cat toto | tr [a-c] [A-C]
AAABBCC CCCBBAAA
% cat toto | tr -d [ac]
bb bb
% cat toto | tr -s [bc]
aaabc cbaaa
% cat toto | tr [a-c] [-*]
------- --------
% cat toto | tr -dc [ac]
aaacccccaaa
Commande sed
sed est un éditeur de texte non interactif qui lit ligne par ligne un fichier ou un flux, applique des commandes d’édition et affiche le résultat sur la sortie standard sans modifier le fichier original.
Commandes principales :
s/expr1/expr2/g: substitution de toutes les occurrences de expr1 par expr2.d: suppression de lignes.
Exemples :
sed "s/toto/TOTO/" fichier
Remplace la première occurrence de « toto » par « TOTO » dans chaque ligne.
sed "s/toto/TOTO/3" fichier
Remplace la troisième occurrence de « toto » par « TOTO ».
sed "s/toto/TOTO/g" fichier
Remplace toutes les occurrences de « toto » par « TOTO ».
sed "s/toto/TOTO/p" fichier
Affiche la ligne modifiée uniquement si une substitution a eu lieu.
sed "s/toto/TOTO/w resultat" fichier
Écrit la ligne modifiée dans le fichier « resultat ».
Suppression de lignes :
sed "20,30d" fichier
Supprime les lignes 20 à 30.
sed "/toto/d" fichier
Supprime les lignes contenant « toto ».
sed "/toto/!d" fichier
Supprime toutes les lignes sauf celles contenant « toto ».
On peut aussi lire les commandes depuis un fichier :
sed -f fichier_commande fichier
Exemple :
% cat toto
aaabbcc cccbbaaa
% sed s/a//g toto
bbcc cccbb
% cat titi
s/b/bc/g
s/c/de/g
% sed -f titi toto
aaabdebdedede dededebdebdeaaa
Commande awk
awk est un langage de traitement de texte puissant qui traite un flux ligne par ligne (enregistrement) et divise chaque ligne en champs séparés par un espace (par défaut).
Structure d’un programme awk :
BEGIN { actions }
critere1 { actions1 }
critere2 { actions2 }
...
END { actions }
Le bloc BEGIN s’exécute une fois au début, le bloc END à la fin, et les autres blocs s’appliquent aux lignes correspondant aux critères.
Variables prédéfinies :
NR: nombre d’enregistrements lus.NF: nombre de champs dans la ligne courante.$0: ligne complète.$1 ... $NF: champs de la ligne.FNR: nombre d’enregistrements dans le fichier courant.FS: séparateur de champs en entrée (par défaut espace).OFS: séparateur de champs en sortie (par défaut espace).RS: séparateur d’enregistrements en entrée (par défaut saut de ligne).ORS: séparateur d’enregistrements en sortie (par défaut saut de ligne).ARGC: nombre d’arguments.ARGV: tableau des arguments.
Critères :
- Sans critère : action appliquée à toutes les lignes.
/expression/: lignes contenant l’expression régulière.$n ~ /expression/: champ n correspondant à l’expression.- Expressions logiques :
>, <, >=, <=, ==, !=, &&, ||, !.
Structures de contrôle similaires au langage C : if, while, do, for, break, continue, exit.
Entrées/Sorties :
getline: lit l’enregistrement suivant.print: affiche des variables.printf: affichage formaté.
Traitement de chaînes :
sub, gsub, gensub: substitutions.index, match: position d’un motif.length: longueur d’une chaîne.split: découpage selon un séparateur.substr: extraction de sous-chaîne.tolower, toupper: conversion de casse.
Options :
-f fichier: lit le programme awk depuis un fichier.-F i: change le séparateur de champs en entrée.-v var=val: assigne une valeur à une variable.
Exemples :
awk 'NR % 2 == 0 { print $0 }' toto
Affiche une ligne sur deux du fichier toto.
awk -F ":" '{ print $1 }' /etc/passwd
Affiche la liste des comptes (premier champ) dans /etc/passwd.
awk -F ":" '/^a/ { print $1 }' /etc/passwd
Affiche les comptes commençant par la lettre a.
awk '{ print NR }' toto
Affiche le numéro de chaque ligne du fichier toto.
wc toto | awk '{ printf("%s: %d lignes, %d mots, %d caracteres\n", $4, $1, $2, $3) }'
Formatage de la sortie de wc.
awk -F ":" '{ $2=""; print $0; OFS=":" }' /etc/passwd
Imprime chaque ligne de /etc/passwd après suppression du second champ.
awk 'END { print NR }' /etc/passwd
Affiche le nombre total de lignes dans /etc/passwd.
awk -F ":" '{ print $NF }' /etc/passwd
Affiche le dernier champ de chaque ligne.
awk 'length($0) > 75 { print $0 }' /etc/passwd
Affiche les lignes contenant plus de 75 caractères.
awk -F ":" 'BEGIN { print "Debut du script" }
{ if ($1 ~ /^[0-9]+$/ && $3 ~ /^[0-9]+$/) print $0 }' /etc/passwd
Affiche les lignes dont le 1er et 3ème champ sont uniquement numériques.
Résultats attendus
- Compréhension claire des flux stdin, stdout, stderr et de leur redirection.
- Maîtrise des expressions régulières pour sélectionner et manipuler du texte.
- Capacité à trier des fichiers avec sort selon différents critères et champs.
- Utilisation efficace de uniq pour filtrer les doublons dans des fichiers triés.
- Utilisation de wc pour compter lignes, mots et caractères.
- Transformation de texte avec tr pour remplacer, supprimer ou compresser des caractères.
- Édition non interactive de fichiers avec sed, notamment substitutions et suppressions.
- Programmation simple avec awk pour filtrer, formater et analyser des fichiers texte.
Pièges courants
- Confondre les flux stdout et stderr lors des redirections, ce qui peut entraîner la perte d’erreurs importantes.
- Oublier de trier un fichier avant d’utiliser uniq, ce qui fausse les résultats.
- Expressions régulières mal formulées, notamment erreurs dans les quantificateurs ou les groupes.
- Mauvaise utilisation des options de sort (-k, -t) qui peut provoquer un tri inattendu.
- Ne pas utiliser l’option
-sde tr pour compresser les caractères répétés quand c’est nécessaire. - Confusion entre suppression de lignes dans sed et modification réelle du fichier (sed ne modifie pas le fichier original).
- Dans awk, oublier que les champs sont séparés par défaut par des espaces, et ne pas ajuster
-Fsi le séparateur est différent. - Ne pas gérer correctement les cas où les champs sont vides ou contiennent des espaces.
Commentaires
Aucun commentaire pour le moment. Posez la première question.