Script bash pour analyser les logs d'apache

Bonjour a tous et meilleurs vœux par la même occasion,

J’ai besoin d’aide concernant un petit projet que j’ai a faire:

Je dois réaliser un script bash qui permet d’analyser les fichier de log d’un serveur apache et de ressortir certaines informations.

Voici mes objectifs:

1)Afficher la liste des 10 adresses IP les plus actives.
En option,pour chacune de ces adresses,il faut récupérer le FQDN s’il existe et le nombre d’IP sans FQDN.

2)Afficher un histogramme des accès heure par heure
3)Afficher la liste des 5 erreurs les plus fréquentes.
4)Afficher le nombre de robots qui on indexé le site.
5)Afficher le temps d’accès moyen pour une même adresse IP
6)Connaitre le nombre de pages lues pour une adresse IP
7)Connaitre le nombre de pages imprimées par IP

J’ai déjà un peu avancé sur le projet :
La tache 3 est faite, voici le code:

touch temp.txt
 executed=$(cat access.log | grep '\" 204'|wc -l)
 echo "$executed erreurs 204">temp.txt
 movedtemp=$(cat access.log | grep '\" 302'|wc -l)
 echo "$movedtemp erreurs 302">>temp.txt
 partial=$(cat access.log | grep '\" 206'|wc -l)
 echo "$partial erreurs 206">>temp.txt
 notfound=$(cat access.log | grep '\" 404'|wc -l)
 echo "$notfound erreus 404">>temp.txt
 redirect=$(cat access.log | grep '\" 301'|wc -l)
 echo "$redirect erreurs 301">>temp.txt
 forbidden=$(cat access.log | grep '\" 403'|wc -l)
 echo "$forbidden erreurs 403">>temp.txt
 badrequest=$(cat access.log | grep '\" 400'|wc -l)
 echo "$badrequest erreurs 400">>temp.txt
 sort -n -r temp.txt >/dev/null
 head -5 temp.txt
 rm temp.txt

La tache 1 est partiellement faite il faut juste récupérer les FQDN avec leurs adresses respectives.
Voici le code:

cut -d ' ' -f1 $access |sort|uniq -c |sort -n|tail>temp.txt
	sort -r -n temp.txt >temp1.txt
	rm temp.txt
	
	while read champ1 champ2 
	do 
		b=0 
		tab[$b]=$champ1
		b=$(($b+1))
		echo -n ${tab[0]}
		echo -n " vues pour l'adresse: "
		tab[$b]=$champ2	
		echo ${tab[1]}
	done <temp1.txt

Mes questions sont:
Que pensez vous du code ?,clarté,efficacité etc, si possible pouvez vous me donner des pistes pour l’améliorer.
Avez vous des pistes pour les autres taches ?

Merci d’avance,
jjbond.

Ps: je joins le fichier de log à traiter pour que vous ayez une idée sur le code.
Le fichier de log faisant plus de 55mo je l’ais compresser.
paf.im/Dt5Ol

salut,

eh, ben, t’es pas rendu ! :frowning:

il faut définir une stratégie globale, pas seulement petit bout par petit bout comme tu le fais.

donc, commencer par savoir ce que contiennent les lignes du log, c’est à dire de quoi elles sont composées, pour pouvoir en retenir les éléments qui t’importe.
reporte-toi à la documentation de apache2 pour identifier ces éléments constitutifs.

ensuite, bash peut à peu près tout faire sans recours à des commandes externes.
dans certains cas, elles peuvent accélérer le processus, mais souvent les appels répétés à ces commandes ralentissent le script.

je ne vais pas détailler ce que tu dois faire.
pour chaque ligne, je scinderais dans un premier tableau en six éléments en utilisant le guillemet en tant que séparateurwhile IFS='"' read -r -a tableau_1; do :; done < accesss.logpuis je subdiviserais dans un autre tableau ces éléments en utilisant l’espace.

puis, j’utiliserais différents tableaux (associatifs ou indexés) pour retenir les données pertinentes en fonction de certaines caractéristiques.

une fois tout le fichier lu, les tableaux (associatifs) remplis, alors, je passerais à la phase d’analyse.

bon, allez, au boulot ! :chores-chopwood: :079