[SHELL] optimisation d'un script

optimisation d'un script [SHELL] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 12-12-2007 à 17:20:34    

Salut la compagnie !
 
J'ai galeré pour écrire un script, du coup il y a plethore de condition les unes derrieres les autres.
 
Je suis sur qu'il existe un moyen beaucoup plus simple. La difficulté, je recherche la date du jour ou de la veille dans un fichier de log mais parfois la date est en format jj/mm/aa et d'autres fois en mm/jj/aa
 
Merci à vous.
 


#!/bin/sh
 
# CREATION DU REPERTOIRE DU JOUR POUR LES LOGS
mkdir -p /home/user/`date +%B`/`date +%d%m%y`/
DATADIR="/home/user/`date +%B`/`date +%d%m%y`"
 
# RECUPERATION DES NOMS DANS LE FICHIER DE CONF
cat /home/user/hosts.conf | grep -v "^#" | awk -F ';' '{ print $1 " " $2  }' | while read NOM ALIAS
do
 
# ON ATTRIBUE UNE VARIABLE POUR LE CHEMIN DU FICHIER
        FICNAME="$DATADIR/$NOM.log"
 
# TEST SI LE FICHIER EXISTE
        if [ -e $FICNAME ]  
        then
                echo "le fichier $NOM.log est present"
 
# TEST SI LE FICHIER EST LISIBLE
                if [ -r $FICNAME ]
                then
                        echo "le fichier $NOM.log est lisible"
                else
                        echo "on tente de changer les droits de $FICNAME"
                        chmod 777 $FICNAME  >/dev/null 2>&1
                        if [ $? -ne 0 ]
                        then
                                echo "$NOM : KO - impossible de changer les droits pour le traitement de la verification"
                                continue
                        else
                                echo "les droits 777 ont bien ete changes"
                        fi
                fi
 
# ON VERIFIE LA PRESENCE DE L4ALIAS DANS LE FICHIER DE LOG
                if grep -i $ALIAS  $FICNAME | sed '1d' >/dev/null 2>&1
                then
                        echo "l alias a bien ete trouve dans le fichier de log"
                        FIC="OK"
                        RES=`/bin/egrep -i "Backup Operation" $FICNAME | /bin/egrep -i  "Cancelled|annulée|failed|annulee"`
                        RESULTAT=`echo $RES | sed -e 's/\.//'`
 
                                if [ "$FICNAME" = "TEST.txt" ]
                                then
                                        if grep -i `date +%m/%d/%y` $FICNAME >/dev/null 2>&1
                                        then
                                                DATELOG=TODAY
                                        else
                                                if grep -i `date --date '1 days ago' +%m/%d/%y` $FICNAME >/dev/null 2>&1
                                                then
                                                        DATELOG=YESTERDAY
                                                else
                                                         DATELOG=OTHER
                                                fi
                                        fi
                                else
                                        if grep -i `date +%d/%m/%y` $FICNAME >/dev/null 2>&1
                                        then
                                                DATELOG=TODAY
                                        else
                                                if grep -i `date +%m/%d/%y` $FICNAME >/dev/null 2>&1
                                                then
                                                  DATELOG=TODAY
                                                else
                                                if grep -i `date --date '1 days ago' +%d/%m/%y` $FICNAME >/dev/null 2>&1
                                                then
                                                 DATELOG=YESTERDAY
                                                        else
                                                         if grep -i `date --date '1 days ago' +%m/%d/%y` $FICNAME >/dev/null 2>&1
                                        then
                                        DATELOG=YESTERDAY
                                        else
                                        DATELOG=OTHER
                                        fi
                                fi
                        fi
                fi
        fi
 
        if [ -n "$RESULTAT" ]
        then
                STATUS=KO
        else
                STATUS=OK
                RESULTAT="pas de probleme"
        fi
 
        if [ "$DATELOG" = "OTHER" ]
        then
                STATUS=KO
                if grep -i `date --date '2 days ago' +%d/%m/%y` $FICNAME >/dev/null 2>&1
                then
                        RESULTAT="erreur, le fichier de log date de l'avant veille"
                else
                        if grep -i `date --date '2 days ago' +%m/%d/%y` $FICNAME >/dev/null 2>&1
                        then
                        RESULTAT="erreur, le fichier de log date de l'avant veille"
                        else
                        RESULTAT="erreur, fichier de log incorrect"
                        fi
                fi
        fi
        echo "$NOM - $STATUS : $RESULTAT"
                else
                                FIC=KO STATUS="prout"
                                echo "$NOM - KO : FICHIER $FIC $STATUS"
                fi
        else
                HEURE=`date +%H`
                if [ $HEURE -ge 0 ] && [ $HEURE -lt 3 ]
                then
                        echo "ce n'est pas l'heure"
                else
                        echo "$NOM - KO : Pas de fichier de log"
                fi
        fi
done
 

Reply

Marsh Posté le 12-12-2007 à 17:20:34   

Reply

Marsh Posté le 12-12-2007 à 18:02:22    

Les premières lignes je ferai :
 

DATADIR="/home/user/$(date +%B)/$(date +%d%m%y)"
mkdir -p "${DATADIR}"


pour être plus propre.
 
D'ailleurs j'aurai tendance à protéger toute les variables :  

"${TOTO}"


et pas  

$TOTO


 
Et aussi à remplacer  

`cmd`


par  

$(cmd)


 (et en plus c'est plus simple à imbriquer)
 
Pour tes tests, on peut dire à grep d'être silencieux avec  

greq -q


, plus propre que  

>/dev/null 2>&1


 
Enfin tu peux grouper tes tests, par exemple tout ceux qui retournent TODAY.
Un exemple de la syntaxe pour en grouper 2 :

if (grep -q -i $(date +%d/%m/%y) "${FICNAME}" || grep -q -i $(date +%m/%d/%y) "${FICNAME}" )


 
Comme tu en as beaucoup tu peux mettre le test sur plusieurs lignes :

if (grep -q -i $(date +%d/%m/%y) "${FICNAME}" \
 || grep -q -i $(date +%m/%d/%y) "${FICNAME}" )


en insérant un \ suivi d'un retour à la ligne.


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 12-12-2007 à 18:03:34    

pourquoi un chmod 777 ?


---------------
Blog photo/récits activités en montagne http://planetcaravan.net
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed