Bonjour,
J'ai la version 3.1.7 de awk.
ton dernier code me sort bien les lignes souhaitées.
Il me faut rediriger cela vers un fichier temporaire si je comprends bien.
Je ne peux pas supprimer les autres lignes directement dans mon fichier ?
Merci
Version imprimable
Bonjour,
J'ai la version 3.1.7 de awk.
ton dernier code me sort bien les lignes souhaitées.
Il me faut rediriger cela vers un fichier temporaire si je comprends bien.
Je ne peux pas supprimer les autres lignes directement dans mon fichier ?
Merci
Exact. C'est plus prudent d'ailleurs. Ça permet de revenir en arrière au cas où...
Maintenant que ça fonctionne, tu peux optimiser légèrement le code en groupant les deux conditions:
Enfin, si ton gigantesque fichier log est trié sur l'année (ce qu'on peut supposer) et que tu souhaites encore diminuer le temps de traitement, il y a moyen de l'optimiser encore plus.Code:
1
2 # impression des lignes de moins de 365 jours now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 || $7~/[:alpha:]/{print}
Bonjour et merci encore de suivre ce post.
Je n'ai pas pu faire plus tôt le test.
Cela fonctionne bien pour afficher mes lignes souhaitées.
Comment intégrer cela pour que celles qui ne sont pas affichées soient supprimées de mon fichier log ?
J'ai fait cela :
code.awk :
J'ai écris un script.sh :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 # initialisation des variables BEGIN { FS="[ :]+" split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", m, " ") for (i=1; i<=12; i++) mnb[m[i]]=i now=systime() ref=mktime("2008 5 3 15 25 10") delta=now-ref # print "Heure système en sec : "now # print "Heure calculée en sec : "ref # print "Différence en sec : "delta } # impression des lignes de moins de 365 jours # now-mktime("$7" "mnb[$2]" "$3" "$4" "$5" "$6")<31536000 {print} # now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 {print} # pour les lignes sans bloc YYYY (2010) --> print # $7~/[:alpha:]/{print} # Regroupement des deux conditions now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)>31536000 && $7!~/[:alpha:]/{print $3" "$4":"$5":"$6" "$7}
Ce script.sh me créé bien mon fichier purge.txt avec les bonnes lignes à supprimer, mais la commande sed ne semble pas les effacer !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #!/bin/sh # Suppression du précédent fichier temporaire if [ -f selection.txt ]; then rm -f purge.txt fi # Analyse du fichier log par awk avec le code.awk vers un fichier temporaire awk -f code.awk monfichier.log>purge.txt # Lecture du fichier temporaire pour purge du fichier while read line do echo "Suppression ligne contenant : "$line sed -i '/$line/d' monfichier.log done < purge.txt
Ai je commis une erreur ?
Tu te compliques la vie. Au lieu d'extraire les lignes anciennes, tu devrais plutôt extraire les lignes récentes et copier le fichier ainsi obtenu sur le fichier d'origine en l'écrasant. Il suffit d'inverser la condition dans le code awk:
Code:now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 || $7~/[:alpha:]/ .....
oui j'ai inversé la commande pour avoir les lignes anciennes.
Je peux écrire sur un fichier alors que je suis en train de l'analysé ?
Avec le code.awk, je peux réécrire la ligne complète sur mon fichier log, et tout ça en même temps ???
Ca me dépasse lol
Bonjour et Merci pour tout.
Je vais procéder de cette manière, je vais faire un max de place avant le traitement au cas ou...
40Go à traiter, je pense que ça va prendre un peu de temps lol
Merci encore pour ta patience et ton aide.
Amicalement,
Thierry
Si tu t'en tiens au code awk plus haut tu seras étonné de la rapidité de traitement. Si ta distro propose mawk (version optimisée de gawk) tu pourras sans doute encore gagner du temps. Parfois de manière impressionnante.
Reviens-nous pour nous dire en combien de temps awk et mawk ont fait le travail.
Tu peux tester à blanc en faisant:
Code:$time awk -f code.awk fichier_orignie > /dev/null
je vais regarder tout cela demain.
Je vais lancer ta commande pour simuler (le temps avec $time je suppose).
Sur ma VM de test, cela ne m'a rien répondu (fichier de 92 lignes 12k)
Merci encore
Juste pour être sûr, la commande est time awk etc... Le $ est le prompt du shell ;)
Et jete un coup d'oeil sur mawk, tu auras peut-être de (très) bonnes surprises sur le temps d'exécution.
mdrrrr, sorry pour pb de lecture :?
Je teste cela et je rends réponse pour déjà partager les résultats.
Bonjour,
lorsque je l'exécute sur mon centos avec mawk, j'ai ceci :
Voici mon code.awk :Citation:
time mawk -f code.awk nagiosgraph.log > /dev/null
mawk: code.awk: line 23: function mktime never defined
mawk: code.awk: line 23: function systime never defined
real 0m0.002s
user 0m0.001s
sys 0m0.001s
Avec awk, au bout de 2h20, toujours pas de réponse lolCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # initialisation des variables BEGIN { FS="[ :]+" split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec", m, " ") for (i=1; i<=12; i++) mnb[m[i]]=i now=systime() # ref=mktime("2008 5 3 15 25 10") # delta=now-ref # print "Heure système en sec : "now # print "Heure calculée en sec : "ref # print "Différence en sec : "delta } # impression des lignes de moins de 365 jours # now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 {print} # pour les lignes sans bloc YYYY (2010) --> print # $7~/[:alpha:]/{print} # Regroupement des deux conditions now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 || $7~/[:alpha:]/{print}
mawk ne semble pas reconnaitre les fonctions systime et mktime car en ligne 23 j'ai rien, c'est la fin de mon code.awk
gawk semble fonctionner avec le même code.awk
Après 2h10, toujours pas terminer !!
je continue de regarder sur le net....
Désolé, absent pendant un moment du taf.
Je n'ai toujours pas trouvé de solution pour mawk.
Rien n'y fait, il b ute sur mktime ou systime...
Pour ce qui est de awk ou gawk, j'ai lancé une analyse pour estimer le temps de la procédure, c'est en cours.
Bonjour,
J'ai mis au point ce script pour utiliser le code.awk :
Le hic et pas des moindres, c'est que cela élague bien mon fichier mais le vide surtout !Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #!/bin/sh # # Script d'elagage du fichier Nagiosgraph.log # Chemin et nom du fichier nagiosgraph log_file="/usr/local/nagios/nagiosgraph/log/nagiosgraph.log" # Chemin du fichier awk awk_file="/scripts/nagiosgraph.awk" # Arret du service Nagios service nagios stop # Elagage du fichier log_file en passant par un fichier temp gawk -f $awk_file $log_file > /tmp/sortie # Remplacement fichier log_file par le nouveau avec les valeurs les plus recentes # mv -f /tmp/sortie $log_file # Redemarrage du service Nagios service nagios start
Une idée ?
Merci