BEGIN{ # Si le nombre d'arguments est egal a 1 # Arret du programme # Il faut au moins 2 arguments (1 nom de fichier de log) # Le script peut accepter plusieurs fichiers de log if(ARGC==1){ print "Nombre d'arguments incorrect" print "Syntaxe : awk -f mail.awk fichierLogMail1 [fichierLogMailn...]" exit 1 } # Initialisation de la variable contenant le nom du fichier # des codes erreurs SMTP errorSmtp="codeErrorSmtp" # Execution d'une commande systeme pour tester si le fichier existe # Arret du programme si le fichier n'existe pas if((system("test -f " errorSmtp))==1){ print "Fichier codeErrorSmtp manquant" exit 1 } # Sauvegarde des donnees du fichier codeErrorSmtp # dans un tableau associatif avec le code en cle while((getline < errorSmtp) == 1){ ligne=$0 split(ligne,tab,"|") tabErr[tab[1]]=tab[2] } # Fermeture du fichier codeErrorSmtp close(errorSmtp) # Affichage du menu while(1){ # Si le choix est passe en argument if(ARGV[1] ~ /^choix=/){ split(ARGV[1],tab,"=") choix=tab[2] if(choix>=1 && choix<=3) break } print "Choix date" print " 1 - all" print " 2 - day" print " 3 - month" printf("Choix : ") # Lecture de l'entree clavier # Si erreur, on quitte la boucle while if((getline choix < "-")!=1) break # Si aucune saisie, reaffichage du menu if(length(choix)==0) continue # Si le choix est compris entre 1 et 3 on quitte la boucle while if(choix>=1 && choix<=3) break } deb=systime() # Si le choix est egal a rien on quitte le programme if(choix==""){ print "Bye" exit 2 } print "-------------------------------------------" print "------- Analyse des fichiers de log -------" print "-------------------------------------------" } # Lecture des fichiers de log # Si la ligne courante contient l'expression recherchee $0 ~ /[0-9][0-9][0-9] [0-9]\.[0-9]\.[0-9]/ && (choix==1 || (choix==2 && $1==getMonth() && $2==getDay()) || (choix==3 && $1==getMonth())) { # Recherche de la position du premier caractere de l'expression xxx x.x.x pos=match($0,/[0-9][0-9][0-9] [0-9]\.[0-9]\.[0-9]/) # Extraction de l'expression xxx x.x.x code=substr($0,pos,9) # Sauvegarde de l'expression comme cle du tableau associatif # et incrementation du compteur codeSmtp[code]+=1 } END{ # Parcourt du tableau associatif codeSmtp totalMessages=0 for(i in codeSmtp){ # Affichage des lignes du tableau # et de la description du code avec la fonction descCode printf("Code %s (%-45s) ==> %5d message(s)\n",i,descCode(i),codeSmtp[i]) totalMessages+=codeSmtp[i] } # Fin du programme fin=systime() duree=fin-deb printf("Total : %d messages\n%d lignes traitees en %d sec\n",totalMessages,NR,duree) exit 0 } # Fonction permettant la recherche de la description du code function descCode(code){ # Extraction des 4 derniers caracteres du code à partir du 6eme caractere codex=substr(code,6,4) # Concatenation de la lettre "X" aux 4 derniers caracteres du code codex="X" codex # Extraction de la description en fonction du code desc=tabErr[codex] # Si le code erreur n'existe pas alors OK desc=(desc != "" ? desc : "OK") # Retour de la description au programme appelant return desc } # Fonction permettant d'obtenir le numero du jour en cours function getDay(){ day=int(strftime("%d")) return day } # Fonction permettant d'obtenir le nom du mois en cours function getMonth(){ month=strftime("%b") return month }