Scripts shell - exercice 4 : redirections
Titre : au lieu de la sortie standard qui oblige d’être présent ou présente lors de l’exécution du script et/ou à recopier les informations dans un fichier texte, on va rediriger la sortie standard (sdout) vers un fichier.
Matériel :
Reprendre l’exercice 3 (avec le fichier donnees3.csv) et le script3.sh que vous avez créé dans l’exercice 3.
Résultat à fournir :
Il faut rediriger le résultat du script3.sh dans un fichier appelé extraction-script3-”anneemoisjour-hhmm”.txt (si on lance le script le 3 février 2008 à 12h10, le fichier de sortie doit s’appeler extraction-script3-20080203-1210.txt ).
Il y a deux façons de faire : intégrer la génération du fichier de sortie au script, c’est la façon la plus propre de procéder, l’autre façon est de rediriger la sortie sur la ligne de commande (c’est alors dépendant de la façon de lancer le script.). Ecrivez les deux manières de faire.
Indications :
Utiliser la redirection > et >>.
Commandes à utiliser : date
Questions à se poser :
Est-il nécessaire de créer un fichier extraction-script3-”anneemoisjour-hhmm”.txt vide avant ? Quelle est la différence entre > et >> ?
Bonus :
Documentez-vous sur la commande tee, et envisagez de l’utiliser dans le script4.sh (qui serait une copie du script 3). Quelle est l’utilité de cette commande ?
à bientôt
Aurélie
1 commentaire pour Scripts shell - exercice 4 : redirections
Commenter
Trackbacks
Pour faire un trackback sur cet article : http://grepgrrl.org/2008/05/13/script-shell-4/trackback/


La correction :
http://www.google.com/notebook/user/12617965857882522712
1. Redirection sur la ligne de commande : sh script3.sh >extraction-script3-`date +”%y%m%d-%H%M”`.txt
(l’espace est indifférent entre le signe de redirection et le nom du fichier > fichier.txt ou >fichier.txt (c’est plus lisible sans espace))
2. Redirection dans le script : à chaque echo ” ” on indique la redirection. on créé une variable dont la valeur sera le fichier de log.
#!/bin/sh
#
# @(#) Extraire et compter des informations
# @(#) Utilisateur : utilisateur normal
# @(#) Usage : sh script.sh
# liste des variables (si utilisées)
MONFICHIER=donnees3.csv
FICHIERTXT=extraction-script3-`date +”%y%m%d-%H%M`.txt
# peut aussi se faire en positionnant une variable pour la date (se dit aussi en franglais “setter” une variable du verbe to set)
# DATEJOURH= puis FICHIERTXT=extraction-script3-${DATEJOURH}.txt
#
# bug de wc -l sur les lignes vides
NBALERT=`cat $MONFICHIER | wc -l`
DATEF=`cat $MONFICHIER | cut -d”;” -f7| tail -1`
# on sait que les 4 premiers caracteres sont l’annee et les caracteres 5 et 6 sont le mois
# il existe d’autres facons de faire :) evidemment. Une date c’est standard :)
ANNEE=`expr “$DATEF” : “\(….\).*”`
MOIS=`expr “$DATEF” : “….\(..\).*”`
# niveau d’alerte le plus frequent :
LEVELF=`cut -d”;” -f5 $MONFICHIER | sort -n | uniq -c | sort -n | tail -1 | cut -d” ” -f8`
# ou bien
#LEVELF=`cut -d”;” -f5 $MONFICHIER | sort -n | uniq -c | sort -rn | head -1 | cut -d” ” -f8`
echo “Pour le mois ${MOIS}/${ANNEE} il y a eu $NBALERT alertes.” >$FICHIERTXT
echo “Les 3 alertes les plus fréquentes sont : ” >>$FICHIERTXT
cut -d”;” -f6 donnees3.csv | sort -n | uniq -c | sort -rn | head -3 >>$FICHIERTXT
echo “Le niveau d’alerte le plus fréquent ce mois est : $LEVELF” . >>$FICHIERTXT
#fin
3. Bonus :
La solution de redirection sur la ligne de commande n’est pas très belle mais elle est souvent utilisée dans les crontab (table d’automatisation de tâches programmées dans le temps man crontab)
Dans les scripts il est très fréquent d’utiliser la commande tee : cela permet de diriger dans un fichier et sur la sortie d’écran si on le sougaite (voir man tee) : ma commande | tee -a $FICHIERTXT
#!/bin/sh
#
# @(#) Extraire et compter des informations
# @(#) Utilisateur : utilisateur normal
# @(#) Usage : sh script.sh
# liste des variables (si utilisées)
MONFICHIER=donnees3.csv
FICHIERTXT=extraction-script3-`date +”%y%m%d-%H%M`.txt
# peut aussi se faire en positionnant une variable pour la date (se dit aussi en franglais “setter” une variable du verbe to set)
# DATEJOURH= puis FICHIERTXT=extraction-script3-${DATEJOURH}.txt
#
# bug de wc -l sur les lignes vides
NBALERT=`cat $MONFICHIER | wc -l`
DATEF=`cat $MONFICHIER | cut -d”;” -f7| tail -1`
# on sait que les 4 premiers caracteres sont l’annee et les caracteres 5 et 6 sont le mois
# il existe d’autres facons de faire :) evidemment. Une date c’est standard :)
ANNEE=`expr “$DATEF” : “\(….\).*”`
MOIS=`expr “$DATEF” : “….\(..\).*”`
# niveau d’alerte le plus frequent :
LEVELF=`cut -d”;” -f5 $MONFICHIER | sort -n | uniq -c | sort -n | tail -1 | cut -d” ” -f8`
# ou bien
#LEVELF=`cut -d”;” -f5 $MONFICHIER | sort -n | uniq -c | sort -rn | head -1 | cut -d” ” -f8`
echo “Pour le mois ${MOIS}/${ANNEE} il y a eu $NBALERT alertes.” | tee -a $FICHIERTXT
echo “Les 3 alertes les plus fréquentes sont : ” >>$FICHIERTXT
cut -d”;” -f6 donnees3.csv | sort -n | uniq -c | sort -rn | head -3 |tee -a $FICHIERTXT
echo “Le niveau d’alerte le plus fréquent ce mois est : $LEVELF .” |tee -a $FICHIERTXT
#fin
exit