IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Découpage chaine dans un script


Sujet :

Shell et commandes GNU

  1. #41
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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

  2. #42
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par fdthierry Voir le message
    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:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # impression des lignes de moins de 365 jours
    now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 || $7~/[:alpha:]/{print}
    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.

  3. #43
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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 ?

  4. #44
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    J'ai fait cela :
    code.awk :
    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
    # 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}
    J'ai écris un script.sh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Ce script.sh me créé bien mon fichier purge.txt avec les bonnes lignes à supprimer, mais la commande sed ne semble pas les effacer !

    Ai je commis une erreur ?

  5. #45
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    now-mktime($7" "mnb[$2]" "$3" "$4" "$5" "$6)<31536000 || $7~/[:alpha:]/ .....

  6. #46
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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

  7. #47
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par fdthierry Voir le message
    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
    Non, tu passes par un fichier temporaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '<code awk>' fichier_depart > /tmp/sortie; mv /tmp/sortie fichier_depart

  8. #48
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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

  9. #49
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par fdthierry Voir le message
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $time awk -f code.awk fichier_orignie > /dev/null

  10. #50
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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

  11. #51
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    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.

  12. #52
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    mdrrrr, sorry pour pb de lecture

    Je teste cela et je rends réponse pour déjà partager les résultats.

  13. #53
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    Bonjour,
    lorsque je l'exécute sur mon centos avec mawk, j'ai ceci :
    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
    Voici mon code.awk :
    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
    # 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}
    Avec awk, au bout de 2h20, toujours pas de réponse lol

  14. #54
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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....

  15. #55
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    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.

  16. #56
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 89
    Par défaut
    Bonjour,

    J'ai mis au point ce script pour utiliser le code.awk :
    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
    #!/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
    Le hic et pas des moindres, c'est que cela élague bien mon fichier mais le vide surtout !

    Une idée ?
    Merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. chaine </script> dans mon script js
    Par Jérémy Lefevre dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/06/2008, 15h26
  2. Découpage chaine et Insertion dans table
    Par star dans le forum SQL
    Réponses: 1
    Dernier message: 09/04/2008, 12h02
  3. Réponses: 21
    Dernier message: 29/09/2005, 19h33
  4. Réponses: 23
    Dernier message: 16/11/2002, 19h41
  5. Réponses: 2
    Dernier message: 10/07/2002, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo