Quelques exercices récapitulatifs
Introduction
Cette section propose quelques exercices utilisant des éléments vus dans les chapitres précédents, et permet une mise en application simple et concrète des syntaxes, principes et conseils présentés dans cet ouvrage.
shell, sed, awk
1. Détermination du jour de la semaine d’une date donnée
Utiliser la commande cal (qui génère un calendrier), ainsi que les commandes sed et awk pour écrire un shell script qui donne le jour de la semaine d’une date donnée.
Indications
La commande cal (disponible sous Unix et Linux) peut afficher un extrait de calendrier pour un mois et une année spécifiés, comme par exemple :
cal 05 2015
qui affiche le résultat suivant :
May 2015
Su Mo Tu We Th Fr Sa
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Il suffit donc d’écrire un shell script prenant en argument les informations relatives au jour que l’on recherche, et de localiser sa position dans le calendrier du mois pour déterminer le jour de la semaine.
On pourra prendre comme syntaxe d’appel du script la syntaxe suivante :
dow JJ MM AAAA
où dow est le nom du script (Day Of Week, ou jour de la semaine), JJ est le numéro du jour dans le mois, MM est le numéro du mois dans l’année, et AAAA est l’année.
Solution
#!/bin/bash
EXP1='s/\(..\) /\1:/g'
EXP2='1,2d;s/ //g'
if [ "$3" = "" -o "$4" != "" ]
then
echo "Usage: `basename $0` JJ MM AAAA"
exit 1
fi
cal $2 $3 | sed "$EXP1"...
find, egrep, hl
1. Colorisation d’un répertoire de niveau donné
Rechercher sous le répertoire /usr tous les fichiers réguliers dont le nom ne se termine pas par .dict ni par .sty, ayant au moins 11 niveaux de répertoires, coloriser en bleu les neuf premiers niveaux, en cyan le dixième niveau, en magenta les éventuels niveaux de répertoires supplémentaires, et en rouge le nom court des fichiers.
Solution
find /usr ! -name '*.dict' ! -name '*.sty' -type f -print \
2> /dev/null | \
egrep 'ˆ(/[ˆ/]+){10}/' | \
hl -e -b "ˆ(/[ˆ/]+){8}/" -c "ˆ(/[ˆ/]+){9}/" -r '[ˆ/]+$' -m '.+'
La commande find recherche sous le répertoire /usr tous les fichiers (au sens large) dont le nom ne se termine pas par .dict (! -name ’*.dict’), ni par .sty (! -name ’*.sty’), dont le type est fichier régulier (-type f), et les affiche (-print).
La redirection 2> /dev/null permet d’éviter de polluer le résultat au cas où certains répertoires ne seraient pas lisibles par l’utilisateur lançant la commande.
La sélection des noms longs comportant au moins 11 niveaux de répertoires est effectuée par la commande egrep de la façon suivante :
egrep sélectionne...