TD USI commandes grep, cut, join ...

Système 1ère année Octobre 2000

1 Locations de cassettes video

On réalise ici une petite application de gestion pour un loueur de cassettes vidéo au moyen de shell-scripts. Il s’agit de gérer la liste des cassettes, la liste des clients, et la liste des emprunts.

Toutes ces données sont contenues dans des fichiers texte, chaque ligne comportant plusieurs champs séparés par des «deux-points».

1.1 Fichier CLIENTS

Champs: référence de client (unique), nom, prénom, adresse

     dup01:dupont:marcel:rue des pommes
     dup02:dupont:berthe:allee des idees
     all01:alliot:bernard:place ricard
     mey01:mery:jean-claude:rue de la duplication

Ici on utilise, en principe, les 3 premières lettres du nom suivies d’un nmnre à 2 chiffres.

1.2 Fichier CASSETTES

Champs: référence de cassette (unique), titre

     enf001:oui oui a la plage
     enf002:wallace et gromit
     hor001:massacre a la tronconneuse
     dra001:titanic
     com002:l'horloge bleue
     com004:le sens de la vie
     enf010:flipper le dauphin
     enf009:toys story
     enf013:toys story 2
     enf014:ouioui et le pere noel
     hor003:les portes de l'enfer
     com003:le pere noel est une ordure

Les trois premiers caractères de le référence indiquent le genre du film : enf = enfants, hor = horreur, etc.

1.3 Fichier EMPRUNTS

Champs: référence de cassette, référence du client et date de l’emprunt

     enf002:1:10/01/1998
     enf001:1:11/01/1999
     com004:3:12/01/2000

1.4 Préparation

Copiez chez vous (dans votre répertoire USI) les fichiers de cette application :

cp -r  /net/home/exemples/USI/td-video-2000 .

2 Travail demandé

2.1 Rappels sur les commandes

• grep permet de sélectionner les lignes d’un fichier qui correspondent à un certain critère, défini par une expression régulière.

• sort renvoie des données triées

• cut renvoie des parties de lignes (champs délimités par des séparateurs)

• head et tail renvoient le début ou la fin d’un fichier.

2.2 Quelques consultations

1. Essayez la commande suivante :

     grep  enf CASSETTES

Donnez une commande permettant d’afficher les titres des films d’horreur (référence hor...).

2. créez un fichier affichage-genre contenant :

     #
     # affichage des cassettes d'un genre donne
     #
     grep $1 CASSETTES

rendez-le exécutable, puis lancez-le :

     chmod +x affichage-genre
     affichage-genre enf

Bravo, vous venez d’écrire votre premier shell-script ! En gros, un script est un fichier texte qui contient une suite de commandes, avec éventuellement des paramètres.

3. Modifiez votre script pour qu’il fonctionne correctement (pas de lignes parasites).

4. Écrivez un script permettant la recherche par une partie du titre. exemple d’utilisation

     recherche-titre toys

Avant d’enregistrer un nouveau client, il faut lui donner une référence qui n’a pas déjà été attribuée et pour cela on consulte le fichier CLIENTS. Analysez la commande suivante :

     grep ^dup CLIENTS | sort | tail -1

5. Recherche des nouveautés : on suppose que la numérotation des cassettes d’un genre reflète leur ordre de sortie. Écrivez un script nouveautes-genre qui affiche les n dernières cassettes d’un genre donné. Exemple, la commande

     nouveautes-genre enf 3

devrait afficher les cassettes enf010, enf013 et enf014.

6. Analysez le fonctionnement de la commande

       cut -d: -f2,3 CLIENTS

2.3 Ajouts

1. Essayez et analysez le script ajouter-client qui suit

       #
       # ajouter-client reference nom prenom adresse
       #
       echo $1:$2:$3:$4 >> CLIENTS

2. Ecrire un script pour ajouter une nouvelle cassette. Exemple:

       ajouter-cassette fic001 "La menace fantome"

3. Essayez ceci (attention aux «apostrophes inversées», touche 7):

       DATE=`date +%d/%m/%Y`
       echo nous sommes le $DATE

4. Ecrire un script pour enregister l’emprunt d’une cassette.

2.4 Retour des cassettes

L’option -v de la commande grep permet de sélectionner les lignes qui ne contiennent pas un critère donné.

   grep -v ^enf CASSETTES

1. Lorsqu’un client rapporte une cassette, on efface la ligne correspondante du fichier des emprunts. Ecrire

le script retour-cassette, utilisable sous la forme :

       retour-cassette com004

3 Rapprochements de fichiers

1. Le programme join permet de faire des «rapprochements» ou «jointures» entre deux fichiers ayant un champ commun. Voici par exemple (script essai-join) comment compléter chaque ligne du fichier EMPRUNTS par la description de la cassette empruntée.

       # tris préalables sur la même clé : la référence des cassettes
       sort -t : -k 1 CASSETTES > CASSETTES.par-ref-cassette
       sort -t : -k 1 EMPRUNTS  >  EMPRUNTS.par-ref-cassette
       # jointure
       join -t : -1 1 -2 1 EMPRUNTS.par-ref-cassette CASSETTES.par-ref-cassette

Les paramètres :

• «-t: » signale que les champs sont séparés par des «deux-points»

• «-1 1 -2 1»les clés des deux fichiers sont dans les premiers champs.

2. Ecrire un script qui donne la liste des emprunts avec le nom et l’adresse du client concerné (un cut bien placé permettra de selectionner les champs utiles).

3. Ecrire un script qui donne la liste des emprunts avec le nom et l’adresse du client concerné et la description du film.

4 Amélioration de la présentation

1. Le programme awk permet de traiter un fichier ligne par ligne. Essayez ceci (script essai-awk) :

       awk -F : '{printf("| %6s | %-30s |\n",$1,$2)}' CASSETTES

Le premier paramètre de printf est une spécification de format qui indique comment seront présentés les paramètres suivants : une barre verticale et un espace, premier élément sur 6 caractères cadrés à droite, un espace, une barre et un espace, le second cadré à droite sur 30 caractères, un espace et une barre suivis par un saut de ligne.

2. Écrire un script afficher-clients qui donne la liste des clients dans l’ordre alphabétique. Conseil : faire un tri du fichier client, puis utiliser awk pour présenter les données.

3. Afficher les cassettes dans l’ordre des titres

4. Afficher les cassettes par catégorie

5. Faire afficher les emprunts en clair :

       10/01/1998  dup001  marcel dupont        enf002 wallace et gromit
       11/01/1999  dup001  marcel dupont        enf001 oui oui a la plage