Exercice 1:
Améliorez le script précédent pour qu’il fasse son travail deux fois par minute.Solution :
Le script checkmail est modifié de la façon suivante :#!/bin/sh
while true ; do
awk f chkmail.awk /var/spool/mail/$USER
sleep 30
done
Et il est maintenant lancé en tâche de fond :
kyle> ./checkmail &
Exercice 2:
Améliorer le script précédent pour qu’il reste silencieux si aucun message n’estarrivé dans la période qui précède.
Solution :
Le script checkmail est modifié de la façon suivante :#! /bin/sh
MABOITE=/var/spool/mail/$USER
STAMP=/tmp/timestamp.$USER
# ce fichier sert a connaitre l'instant auquel j'ai
# remarque une modification de ma boite aux lettres
rm –f $STAMP
while true ; do
if [ s $MABOITE ] ; then
if [ $MABOITE –nt $STAMP ] ; then
clear;
awk f chkmail.awk $MABOITE
touch $STAMP
fi
fi
sleep 30
done
Exercice 3:
Si vous travaillez dans l’environnement X11, lancez ce script en background dansune petite fenêtre dans un coin de votre écran. Il est supérieur au programme xbiff
à deux points de vue :
- vous savez si le message qui vient d’arriver mérite le dérangement ;
- vous avez la satisfaction de l’avoir fait vous-même.
Solution :
kyle> xterm –geometry 60x7 0+0 +sb e ./checkmail &Exercice 4:
Écrire un script qui lit un message sur son entrée standard et recopie :- l’en-tête du message dans le fichier "./_header" ;
- le corps du message dans le fichier "./_body".
Un tel script est l’outil de base permettant d’automatiser le traitement des messages
à l’arrivée. Écrire une solution sed et une solution awk.
Solution :
Le fichier splitmail.sed contient :#n
1,/^$/w _header
/^$/,$ {
/^$/d
w _body
}
La commande sed traitant le message est :
kyle> cat message | sed –f splitmail.sed
Le fichier splitmail.awk contient :
BEGIN {FICH = "_header"}
/^$/ {FICH = "_body"}
{print > FICH }
La commande awk traitant le message est :
kyle> cat message | awk –f splitmail.awk
Exercice 5:
Chercher un motif dans un fichier avec egrep, c’est facile :egrep 'ere' fichier
Remplacer une chaîne qui vérifie une expression régulière par une nouvelle chaîne,
c’est facile aussi, mais moins, et c’est surtout long à taper, et il faut rediriger, ... Ce
qu’il faudrait, c’est un sed simplifié "à la grep", nommé remplace, à utiliser dans
les cas tous simples, comme par exemple :
remplace 'pays' 'paysage' *.txt
Ce qui signifie : dans tous les fichiers d’extension .txt, remplacer toute occurrence
de la chaîne pays par paysage.
Bien sûr, comme pour egrep, le premier argument est une expression régulière.
Solution :
#!/bin/bashif [ $# lt 3 ] ; then # Il faut au moins trois arguments
echo erreur : remplace 'ere' 'nchaine' file..
exit 1
fi
ERE="$1" # le premier arg est l'expression
REPLACE="$2" # le deuxieme arg est la nouvelle chaine
SEP='%' # nous utiliserons % comme separateur
# (le caractere / pourra apparaitre dans l'expression)
shift; shift
# maintenant, $1 contient le premier nom de fichier
# faire une boucle sur tous les fichiers passes
# en arguments
while [ z$1 != z ] # teste si $1 n'est pas vide
# (encore un fichier a traiter?)
do
if [ f $1 ] ; then # $1 est un fichier
sed "s${SEP}${ERE}${SEP}${REPLACE}${SEP}g" $1 \
>/tmp/replace.$$
# le resultat est dirige vers un fichier
# temporaire qui est recopie sur le fichier
# d'origine si sed a effectue au moins une modification
[ $? = 0 ] && cat /tmp/replace.$$ >$1
else
echo $1 n\'est pas un fichier, ignore
# $1 peut etre un repertoire
fi
shift # pour passer au suivant, decaler les
# arguments d'un pas vers la gauche
done # et passer au suivant : fin de la boucle.
rm f /tmp/replace.$$
# faire le menage quand tout est fini
ConversionConversion EmoticonEmoticon
Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.