Tux

Le système UNIX

TD 4 - Les filtres

C. Drocourt
I.U.T. Amiens
drocourt@iut-amiens.fr

Rappel :

Le principe des filtres

Un tube | permet de connecter deux commandes en envoyant les résultats de la première commande (sortie standard) en entrée dans la seconde commande (entrée standard). Une commande placée derrière un tube est appelée filtre.
Les filtres, agissant sur des flots de données, chaînés entre eux par des tubes sont au cœur de la philosophie d'UNIX.

Essayer :
$who | wc –l
Avec cette méthode, les données transitant dans le tube sont perdues. On peut les sauvegarder en insérant une commande tee.

Essayer :
$who | tee beurk | wc –l
Examiner le contenu de beurk.

Filtres usuels
La commande wc
Compte les caractères, les mots et les lignes. Trois options permettent de ne compter seulement que les caractères (option c), que les mots (option w) ou que les lignes (option l).

La commande cat
Ecrit le contenu du fichier sur la sortie standard

La commande head
Donne le début d'un fichier.
head <fic>              donne les dix premières lignes du fichier
head -<n> <fic>     donne les n premières lignes du fichier

La commande tail
Donne la fin d'un fichier.
tail <fic>                  donne les dix dernières lignes du fichier <fic>.
tail -<n> <fic>         donne les n dernières lignes du fichier <fic>.
tail +<n> <fic>         donne la fin de <fic> à partir de la ligne n.

La commande grep
grep <motif> <fic> recherche les lignes du fichier <fic> contenant la chaîne <motif>
Quelques options de la commande grep:
    -c     pour avoir uniquement le nombre de lignes satisfaisantes
    -i     pour ne pas différencier minuscules et majuscules
    -n     pour afficher les numéros de ligne
    -v     pour obtenir les lignes où le motif n'existe pas

grep peut également utiliser les expressions régulières :
grep ‘^b’ /etc/passwd affiche les lignes commençant par ‘b’
grep ‘csh$’ /etc/passwd affiche les lignes finissant par ‘csh’

La commande egrep
Le filtre egrep autorise les clés multiples ; il tend à remplacer grep.
egrep ‘[Hh]ard|[Dd]ur’ doc* affiche les lignes contenant un des mots Hard, hard, Dur ou dur, ceci pour tous les fichiers dont le nom commence par doc.

La commande sort
Trie les lignes d'un fichier selon un critère paramétrable.
sort <fic> trie les lignes du fichier <fic> dans l'ordre ASCII en ne considérant que le premier champ. Par défaut, le séparateur est la tabu1ation ou l'espace.

Quelques options sont disponibles:
    -n     pour un tri numérique
    -f     pour ne pas différencier minuscules et majuscules
    -r    pour l'ordre inverse
    -b     pour ignorer les espaces de tête dans les comparaisons
    -d     seules les lettres, chiffres et espaces sont significatifs dans les comparaisons

On peut également faire un tri sur un autre champ que le premier : sort +2 <fic> triera les lignes du fichier <fic> dans l'ordre ASCII à partir des chaînes du troisième champ. On peut également changer de séparateur de champs avec l'option -t<x> où x est le caractère choisi comme nouveau séparateur.

La commande uniq
Evite la répétition de lignes adjacentes identiques.
uniq <fic> compare 1es lignes adjacentes du fichier <fic>.Si une ligne est identique à ses suivantes, seul un exemplaire est fourni.

Options:
    -u     seules les lignes existant en un seul exemplaire sont fournies.
    -c     le nombre d'occurrences de chaque ligne est affiché.

Exercice  1 :

– Afficher une liste triée des utilisateurs connectés avec leur termina1 et l'heure de connexion au système.
– Afficher le nombre des utilisateurs connectés.
– Afficher le nom, le terminal et la date de connexion de l'utilisateur connecté sur pts/0.

Exercice  2 :

On étudie ici le fichier "/etc/passwd".
– Afficher la ligne de ce fichier qui vous concerne.
– Afficher les lignes qui correspondent aux utilisateurs du Korn-shell ksh.
– Afficher 1e nombre d'utilisateurs du shell de Bourne bash.
– Afficher le contenu de ce fichier trié par ordre d'UID croissant.

Exercice  3 :

Dans votre catalogue principal, créer un fichier référencé berliet comportant douze lignes numérotées de 1 à 12.
Afficher les lignes 5 à 9 (bornes incluses) du fichier berliet.

Exercice  4 :

– Afficher tous les renseignements concernant le fichier le plus grand de votre catalogue principal.
– Afficher le nombre de sous-répertoires de votre catalogue principal.

Exercice 5 : commande cut

Elle permet de découper des champs sélectionnés dans chacune des lignes d'un fichier. Avec grep (coupures horizontales) et cut (coupures verticales), on peut donc extraire un élément isolé d'un fichier.
Deux syntaxes sont disponibles:
    cut -c<liste> <fic>
    cut -f<liste> -d<car> [-s] <fic>
liste est une liste de numéros de champs (en ordre croissant) séparés par des virgules:
1,4,7     ne seront extraites que les colonnes 1, 4 et 7.
1-3,8     pour 1,2,3,8
-5,8     pour 1,2,3,4,5,8
3-     pour tous les champs à partir du troisième

Avec l'option c, la liste spécifie les positions des caractères sélectionnés, par exemple -c1-15 donnera les quinze premiers caractères de chaque ligne.
Avec l'option f, la liste est une liste de champs considérés par défaut comme séparés par le caractère <tabulation>. Par exemple -f1,7 affichera le premier et le septième champ de chaque ligne. Les lignes ne comportant aucun séparateur seront transmises sans transformation sauf si l'option s est précisée, auquel cas elles seront supprimées.
L'option d permet de choisir le séparateur. Tout caractère ayant une signification spéciale pour l'interpréteur de commandes doit être mis entre guillemets.

1 – Afficher la liste triée des noms des utilisateurs connectés.
2 – Afficher le nom de l'utilisateur connecté sur tty03.
3 – A partir du fichier "/etc/passwd" :
         Afficher le nom des utilisateurs du Bourne Again Shell  bash.
         Afficher la liste des utilisateurs triée par ordre alphabétique sous le format suivant : nom UID GID

Exercice 6 : commande awk

La commande awk
est un utilitaire de scrutation et de traitement de modèle. Il s'agit d'une commande très complète et assez complexe à utiliser, on se contentera ici d'une étude superficielle.

awk [ -Fcar ] [ prog ] <fic>
Les lignes du fichier <fic> vont être tour à tour examinées, chacune étant découpée en champs séparés par des espaces ou par <car> si l 'option F est utilisée. La chaîne <prog> spécifie l'action à entreprendre sur chaque ligne ; elle doit être mise entre apostrophes pour éviter son interprétation par le shell.

Essayer par exemple les commandes qui suivent:
date
date | awk '{ print $3 $2 $6 }'
date | awk '{ print $3 , $2 ",", $6 }'

A partir du fichier "/etc/passwd":
1 – Quel est le nombre d'utilisateurs membres du groupe profs ? On affichera une phrase du type :"Il y a 12 utilisateurs membres du groupe profs".
2 – Afficher la liste des utilisateurs triée par ordre de GID décroissant sous le format suivant : UID nom GID.