Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/04/2014, à 01:30

jachtako

trie de fichier

bonjour,
bonjour j'ai écrire ce script pour trier un fichier log mais ce script me prend près de 5h de temps pour parcourir tout le fichier de 755670 lignes voici mon script

#!/bin/bash
fich=/home/christian/pay/access.log
if [ -f $fich ]
then
echo "date debut : $1, date fin : $2"
while read line; do
remoteHost=$(echo $line | cut -d" " -f1-2 | cut -c2-20)
time=$(date -d "$remoteHost" +%s)
dataLength=$(echo $line | cut -d" " -f10 | sed "s/.$//")
if [ $time -lt $1 ] && [ $time -gt $2 ]
then
somme=0
nbrLine=1
((nbrLine+=$dataLength))
(( somme += $ligne ))
fi
done < $fich
echo -e "requettes totales : $nbreLine\t volume total : $somme"
fi

il permet en fait de ressortir la date et le volume de donnée échangé dans le fichier log puis a la fin il fait le total des lignes et la somme des données échangées. bref il prend en paramètre deux variables "datedebut" "datefin" et les lignes dans cette intervalles sont évaluées.

je voudrai savoir sil ya un script qui pourrai parcourir le fichier log plus rapidement.
exemple de ligne log
[2014-04-10 09:57:41] 192.168.206.16:55881 payzen.lyra-labs.fr:443 TLSv1.2(DHE-RSA-AES256-SHA) "POST /vads-payment/exec.card_input.a HTTP/1.1" 200 7460B "- - -" - - - - - -

edit modo : balises [ code ]

Dernière modification par nesthib (Le 21/04/2014, à 07:09)

Hors ligne

#2 Le 18/04/2014, à 08:01

pingouinux

Re : trie de fichier

Bonjour,
Il y a des choses curieuses dans ton script. L'as-tu déjà testé sur un petit fichier log ?

#!/bin/bash
fich=/home/christian/pay/access.log
if [ -f $fich ]
then
   echo "date debut : $1, date fin : $2"
   while read line; do
      remoteHost=$(echo $line | cut -d" " -f1-2 | cut -c2-20)
      time=$(date -d "$remoteHost" +%s)
      dataLength=$(echo $line | cut -d" " -f10 | sed "s/.$//")
      if [ $time -lt $1 ] && [ $time -gt $2 ]                             # Test inversé ?
      then
         somme=0                             # À initialiser avant la boucle
         nbrLine=1                           # À initialiser (à 0) avant la boucle
         ((nbrLine+=$dataLength))            # nbrLine+=1           ?
         (( somme += $ligne ))               # somme += $dataLength ?
      fi
   done < $fich
   echo -e "requettes totales : $nbreLine\t volume total : $somme"        # requêtes nbrLine
fi

Quand le script tournera correctement sur un petit fichier, il sera possible de l'optimiser, mais il faut d'abord être sûr de ce que tu veux faire.

Hors ligne

#3 Le 21/04/2014, à 06:09

nesthib

Re : trie de fichier

Pourrais-tu donner un extrait plus conséquent de ton fichier de log (quelques dizaines de lignes) ?
Une proposition qui devrait être beaucoup plus rapide :

DATE1=2014-04-09
DATE2=2014-04-11
awk -F'[\\[\\] ]+' -v DATE1="$DATE1" -v DATE2="$DATE2" '{if ($2>DATE1 && $2<DATE2){n++;d+=gensub("B$", "", 1, $11)}} END{print "Nb requêtes : "n"\nVolume : "d"B"}' fichier.log

Tiens moi au courant de la durée d'exécution, tu risques d'être satisfait wink

NB. Si le format de l'URL est variable et peut contenir des espaces mais que la fin de la ligne est constante ("- - -" - - - - - -) tu peux utiliser « $(NF-9) » à la place de « $11 ».


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne