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

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 :
  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