:: Enseignements :: Licence :: L1 :: 2008-2009 :: Unix ::
[LOGO]

Des redirections aux scripts


On revoit quelques redirections, ainsi que les variables shell, et on écrit notre premier script.
Rappel des redirections :
  • < redirection de l'entrée standard depuis un fichier donné
  • > redirection de la sortie standard vers un fichier donné
  • 2> redirection de la sortie d'erreur vers un fichier donné
  • >> redirection de la sortie standard vers la fin d'un fichier donné
  • | tube de la sortie standard d'une commande vers l'entrée standard d'une autre
  • $(...) utilisation en ligne de commande de la sortie d'une commande

Exercice 1 - Redirections et base de donnée

  1. Téléchargez le texte compressé à l'adresse flickr-comments.txt.gz. Il contient 10000 commentaires faits sur les photos du site de partage d'images Flickr.
  2. Nous ne décompresserons pas le fichier, pour ne pas prendre trop de place sur le disque. Afficher le fichier (zcat).
  3. Ce fichier est gros. Pour mieux voir, redirigez la commande précédente pour n'afficher que quelques lignes (head, tail) ou bien visualiser page par page (more, less). Chaque ligne du fichier correspond à un commentaire. Les colonnes correspondent aux champs suivants :
    • date d'aspiration
    • identifiant photographe
    • identifiant photo
    • identifiant commentateur
    • date du commentaire
    • texte du commentaire
    Le séparateur entre les champs est la tabulation \t; le séparateur entre les commentaires est le retour à la ligne \n. Les lignes sont triées par identifiant photo. La photo "74" du photographe 12037949754@N01 peut par exemple être vue à l'addresse http://www.flickr.com/photos/12037949754@N01/74.
  4. Trouvez et affichez les commentaires contenant le mot "Flickr", ou le mot "Paris", ou le mot "face" (grep).
  5. Affichez uniquement le texte des commentaires (cut).
  6. Affichez uniquement les champs "identifiant de photographe" et "commentaire" (cut ou awk qui gère directement les champs séparés par des tabulations).
  7. Même question que précédemment, mais en triant le résultat selon l'identifiant du photographe (sort).
  8. Même question, en supprimant les doublons (uniq).
  9. Comptez le nombre de photos différentes (wc).
  10. Affichez le contenu du fichier trié selon la date du commentaire.
  11. Lister les mots qui apparaissent dans les commentaires avec leurs fréquences et en triant par fréquences décroissantes (tr).

Exercice 2 - Manipulation de bitmap

  1. Téléchargez l'image tiger.pgm, visualisez-la (display) et ouvrez-la dans un éditeur de texte. Les fichiers PGM-ASCII sont un type d'images bitmap. Après un entête de quatre lignes précisant le type du fichier, un commentaire éventuel, la taille de l'image, le nombre de niveaux, on y voit une séquence de nombres entre 0 et 255 qui représentent le niveau de gris des points successifs de l'image (0=noir et 255=blanc).
  2. Recherchez un point qui n'est ni noir ni blanc, par exemple un point dont le niveau commence par 1. Rappel : vi, grep, et autres peuvent chercher des expressions rationnelles, dans lesquelles ^ représente le début de ligne, $ la fin de ligne, . un caractère quelconque...
  3. Remplacez tous les niveaux jusqu'à 99 par 0, et tous les niveaux à partir de 100 par 255. Observez l'image en noir et blanc obtenue (display).
  4. Fermez l'éditeur. Le format PPM est l'équivalent du format PGM, mais en couleur : chaque point est représenté par un niveau de rouge, un niveau de vert, un niveau de bleu. Téléchargez le fichier tiger.ppm et observez son contenu : après l'entête, les lignes contiennent trois nombres entre 0 et 255 séparés par des tabulations (caractère \t).
  5. La couleur (204,114,38) est un orange. En ligne de commande, remplacez-la par (179,38,204) pour obtenir un nouveau fichier tiger2.pgm et observez le résultat (display).
  6. Écrivez cette dernière commande dans un fichier colorie.sh, pour lequel vous vous donnerez les droits en exécution, et qui contiendra #! /bin/bash (nom de l'interpréteur) comme première ligne. Exécutez ce script (./colorie.sh).
  7. Un script peut accéder aux arguments en ligne de commande via $1, $2... Modifiez le script pour qu'il prenne en argument le fichier sur lequel faire la modification et le fichier vers lequel enregistrer la nouvelle image.
  8. Changez ce script pour qu'il prenne en argument les trois niveaux de la couleur vers laquelle vous voulez remplacez le orange.
  9. À partir de là, ce sont des questions bonus. Faites peut-être l'exercice suivant avant. Modifiez votre script pour qu'on ait le choix de spécifier une couleur, avec l'option -o, ou pas, auquel cas on remplacera par une couleur par défaut (blanc). Même question pour la couleur à remplacer, avec l'option -c.
  10. Faites en sorte que l'on puisse prendre l'argument des couleurs avec les trois composantes entre parenthèses et séparées par des virgules, comme "(174,38,204)" (echo, cut).
  11. Faites en sorte que votre script puisse prendre en argument des noms de couleur anglophones, en allant chercher les niveaux rouge-vert-bleu correspondants dans le fichier /etc/X11/rgb.txt.
  12. En fait, les fichiers PNM (PPM, PGM, PBM) ne font pas la différence entre retours à la ligne, tabulations, espaces. Le fichier tiger0.ppm est par exemple toujours valide. Téléchargez-le et observez les différences avec le précédent. Pour faire les observations de remplacement de couleur comme ci-dessus, le plus simple est de le transformer au préalable pour remettre les trois composantes d'un même point sur une même ligne. Comment faire (tail, tr, sed) ?

Exercice 3 - Chemins d'exécution

  1. Placez vos scripts éventuels dans un répertoire ~/bin. Modifiez la variable d'environnement PATH pour qu'il inclue ce chemin, de sorte que les scripts soient exécutables de n'importe où.
  2. Pourquoi, si vous ouvrez un autre terminal, cela ne fonctionne plus ? Remédiez-y (export).
  3. Définissez un alias lla qui définisse un ls qui affiche les fichiers cachés au format long (alias).
  4. Modifiez (ou créez si nécessaire) le fichier ~/.bashrc se trouvant à la racine de votre compte pour que ces deux dernières modifications persistent aux prochains démarrages de votre session.
  5. Que contient le fichier ~/.bash_history également à la racine de votre compte ?
  6. Affichez toutes les variables d'environnement (env). Affichez uniquement celles dont les valeurs contiennent fr.
  7. Changez la langue des pages de manuel (variable LC_ALL).