Bonjour,

Cette fonction a pour but de copier dans le répertoire /$contexte/diffusion/tmp/ une portion de log horodatée. Les variables d'entrée sont notifiées dans un fichier.
Dans liste il peut y avoir plusieurs lignes de ce type.
$contexte $instance $heure_debut $heure_fin $type_log $AAAA_MM_JJ $nom_serveur
Le script peut donc parser plusieurs lignes.

J'ai 2 répertoires différents

Dans ce répertoire /$contexte/log/tech/jonas/jonas$instance /
$nom_log peut prendre les noms suivants :
$type_log.log ( log courant)
$type_log.log.$AAAA_MM_JJ.001 (log courant splitté par taille )
$type_log.log.$AAAA_MM_JJ.002
$type_log.log.$AAAA_MM_JJ.002
etc.
$type_log.log.$AAAA_MM_JJ.tar.gz (log de 1 journée archivé à J+1)

A j+2 les tar.gz sont déplacés dans ce répertoire /$contexte/archivage/$instance /
Ici $nom_log peut prendre le nom suivant :
$type_log.log.$AAAA_MM_JJ.tar.gz

Concrètement les variables peuvent renvoyer :
server.log
server.log.2013-07-31.001
server.log.2013-07-29.tar.gz

La fonction fonctionne sauf pour le cas qui prend en compte la date du jour c'est à dire quand les log courants se terminent par 001 002 etc. Les logs courants server.log et server.log.2013-07-29.tar.gz quant à eux fonctionnent.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
function grep_hour
{
        # Declarartion des variables
        contexte=$(echo $1 |tr [:lower:] [:upper:])
        instance=$(echo $2 |tr [:lower:] [:upper:])
        heure_debut=$3
        heure_fin=$4
        type_log=$5
        AAAA_MM_JJ=$6
        date_du_jour=$(echo $(date '+%Y/%m/%d') | sed 's/\//-/g') # Date du jour au format AAAA-MM-JJ
 
        # Traitement particulier du server.log
        if [ ! "$date_du_jour" = "$AAAA_MM_JJ" ]; then
                nom_log="$type_log*.log.$AAAA_MM_JJ.tar*"
 
        else
               nom_log="$type_log.log"
 
                fi
                if [ "$server" == "$7" ]; then
                        ssh=""
                else
                        ssh="ssh -n $7"
 
                       $ssh find /$contexte/archivage/$instance/ /$contexte/log/tech/jonas/jonas$instance/ -type f -iname "$nom_log"  2> /dev/null |\
 
                 { while read FICHIER; do # Debut de la boucle while
                        REPERTOIRE=$(dirname "${FICHIER}")
                        nom_de_log=$(basename "${FICHIER}")
                                if [ "$date_du_jour" = "$AAAA_MM_JJ" ]; then
                                        DATE=$(echo $(date '+%d/%m/%Y'))
                                else
                                        DATE=$(echo $nom_de_log | sed 's#.*\([0-9][0-9][0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]\).*#\3/\2/\1#') # Extraction de la date du nom de fichier
                                fi
                        newdate=$(echo $DATE | sed 's/\//-/g') # Formatage de AAAA/MM/JJ en JJ-MM-AAA
                                # Choix de la commande cat ou gunzip -c suivant l'extension
                                if [[ "$nom_de_log" =~ .gz$ ]]
                                        then z_cat="gunzip -c"
                                        else z_cat=cat
                                fi
                        # Bornage horaire du log
                        $ssh $z_cat "$REPERTOIRE/$nom_de_log" | awk -F"[/ \\\][]" -v S="$DATE $heure_debut" -v E="$DATE $heure_fin" ' #Exemple -v S="10/12/2012 10:15" -v E="10/12/2012 11:30"
                                function dcmp(b) { #Parsing du log
                                if($4>b[3])return  1; # On compare d abord les annees ($4 et b[3]).
                                if($4<b[3])return -1; # Si elles sont differentes, on renvoie 1 ou -1
                                if($3>b[2])return  1; # Si elles sont egales, on compare les mois ($3 et b[2])
                                if($3<b[2])return -1; # S ils sont differents, on renvoie 1 ou -1
                                if($2>b[1])return  1; # S ils sont egaux, on compare les jours ($2 et b[1])
                                if($2<b[1])return -1; # S ils sont differents, on renvoie 1 ou -1
                                if($5>b[4])return  1; # S ils sont egaux, on compare les heures ($5 et b[4])
                                if($5<b[4])return -1; # Si elles sont differentes, on renvoie 1 ou -1
                                return 0; # Si elles sont egales, on renvoie 0
                                        }
                                        BEGIN{split(S, ds, "[/ ]"); split(E, de, "[/ ]") }
                                        /^[[][0-9][0-9]\/[0-1][0-9]\/[[0-9][0-9][0-9][0-9] / { #Fait correspondre les lignes qui commencent par deux chiffres suivis par une barre oblique puis 0 ou 1 puis des chiffres puis un slash et enfin 4 chiffres (c est a*dire 1 ligne qui commence par une date au format 99/99/9999).
                                        if(s&&dcmp(de)>=0) {print; exit} #si la date_de_depart deja trouvee (s est non vide / zero) et ate dans la ligne courante> = date_de_fin alors editee ligne actuelle et arreter le traitement.
                                        if(!s&&dcmp(ds)<=0) {f=x;w=1}#si la date_de_debut n est pas encore trouvee (s nest pas initialisee) et la date dans la ligne actuelle <= date_de_debut, contenu vierge de la variable f et initialiser la variable w. f est un tampon qui contient toutes les lignes trouvees a*partir du debut du document.
                                        if(!s&&dcmp(ds)>=0) {printf "%s",f; f=x; s=1 } #si les variables w et s ne sont pas initialisees coller la ligne courante dans le tampon de f. #si les variables w et s ne sont pas initialisees, coller la ligne courante dans le tampon de f.
                                        }
                                        !w&&!s {f=f $0 "\n"} # si le variable s n est pas initialisee editer la ligne courante.
                                        s' > "/$contexte/diffusion/tmp/$7.$instance.$newdate.${heure_debut}H-${heure_fin}H.log"
                        echo "Le log $7.$instance.$newdateH${heure_debut}H-${heure_fin}H.log se trouve dans /$contexte/diffusion/tmp/"
                        OK=1; # Test fichier present
                        done;
                        [ "$OK" != "1" ] && echo -e "Il n'y a pas de log a la date du "$AAAA_MM_JJ""; # Test fichier absent
 
                } # Fin de la boucle while
fi
} # Fin de la fonction grep_hour
 
# Comportement du script suivant le nombre de  parametres
case $# in
               1)      if [ ! -f "$1" ]; then
                        echo -e "# Alimenter les 7 variables ci-dessous \n# contexte instance heure_debut heure_fin type_log date \n # "\
                        > $1 && echo -e "Merci de remplir le fichier "$1" :\nUne fois rempli, taper $(basename $0) "$1"\n appuyer sur ENTREE"
                        read -p ""
                        echo $REPLY vi $1
                        else
                        while read CONTEXTE INSTANCE HH_debut HH_fin type_log DATE
                        do
                        [ "${CONTEXTE:0:1}" = "#" ] && continue # Ignore les commentaires
                        [ -z "$CONTEXTE" ] && continue # Ignore les lignes vierges
                                grep_hour $CONTEXTE $INSTANCE $HH_debut $HH_fin $type_log $DATE # Traitement par la fonction grep_hour
                        done < $1
                fi
                ;;
        7)    grep_hour $1 $2 $3 $4 $5 $6 $7 # Traitement des parametres par la fonction grep_hour
                ;;
        8)      echo -e "# Alimenter les 7 variables ci-dessous\n# contexte instance heure_debut heure_fin date" > $1          # creation du fichier $1 au choix
                echo $2 $3 $4 $5 $6 $7 $8 >> "$1"                  # concatenation des variables dans $1
                                grep -v '^#' "$1" | # Omet les commentaires
                                while read CONTEXTE INSTANCE HH_debut HH_fin type_log DATE nom_serveur # Parse les parametres
                                do grep_hour $CONTEXTE $INSTANCE $HH_debut $HH_fin $type_log $DATE $nom_serveur # Traitement des parametres par la fonction grep_hour
                                done
                ;;
esac

Je ne suis pas arrivé à trouver une expression régulière qui engloberait tous les cas.

je vous remercie de votre aide.