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 :

Problème traitement dans fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Par défaut Problème traitement dans fichier
    Bonjour à tous,

    Je suis en train de travailler sur un script en bash qui fait récupère des chaines de caractères dans un fichier de type ping. Je vais essayer de donner ma marche à suivre avant d'expliquer mon problème...en espérant être clair.

    Supposons que j'ai un répertoire dir qui contiennent des fichiers de type ping. Je fais la commande suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    grep -A "Lost" *ping* > "file_ping.txt"
    Ceci me donne le fichier suivant (file_ping.txt):
    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
     
    --
    20358-2009-03-26-02.59-ping.txt: Packets: Sent: 20, Received:20, Lost=0 (0%loss)
    20358-2009-03-26-02.59-ping.txt: Approximate time in milli-seconds
    20358-2009-03-26-02.59-ping.txt: Minimum=2.40ms, Maximum=3.20ms, Average=3.01ms, Jitter statistical=1.49ms
    20358-2009-03-26-02.59-ping.txt:
    --
    20358-2009-03-26-03.59-ping.txt: Packets: Sent: 20, Received:20, Lost 0 (0%loss)
    20358-2009-03-26-03.59-ping.txt: Approximate time in milli-seconds
    20358-2009-03-26-03.59-ping.txt: Minimum=2.32ms, Maximum=3.10ms, Average=2.98ms, Jitter statistical=1.25ms
    20358-2009-03-26-03.59-ping.txt:
    --
    20358-2009-03-26-03.59-ping.txt: Packets: Sent: 20, Received:0, Lost 0 (100%loss)
    20358-2009-03-26-02.59-ping.txt:
    --
    20358-2009-03-26-03.59-ping.txt: Packets: Sent: 20, Received:20, Lost 0 (0%loss)
    20358-2009-03-26-03.59-ping.txt: Approximate time in milli-seconds
    20358-2009-03-26-03.59-ping.txt: Minimum=2.32ms, Maximum=3.10ms, Average=2.98ms, Jitter statistical=1.25ms
    20358-2009-03-26-03.59-ping.txt:
    --
    Mon but est de récupérer le loss, le min, max, average et gigue. J'y arrive par le biais d'une boucle de la façon suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    cat "file_ping.txt" \
    | while read var
    	do 
    	echo $var | grep "Lost" | sed -e 's/..........' | tr -d '\n'
    	echo $var | grep "Minimum" | sed -e 's/..........'
    done >> "ping.txt"
    Les ... sont sans importance ici, j'y substitue juste ma chaine de caractère afin de récupérer les infos importantes.
    Ceci a pour résultat un fichier de plusieurs lignes; sur chacune d'elle y sont contenus la perte, le min, le max, la moy et la gigue pour un seul fichier.

    Le problème ici est que si la perte est totale (loss=100%), dans le fichier n'est contenu que la perte et rien d'autre. Du coup, le min et autres n'y sont pas. Et donc, je me retrouve avec une ligne qui contient 100% et la ligne suivante comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    0% 2.40 3.20 3.01 1.49
    0% 2.32 3.10 2.98 1.25
    100%0% 2.32 3.10 2.98 1.25
    Je me demandais donc comment simplement passer à la ligne dans cette situation où la perte est totale et ainsi avoir simplement:

    [/CODE]
    0% 2.40 3.20 3.01 1.49
    0% 2.32 3.10 2.98 1.25
    100%
    0% 2.32 3.10 2.98 1.25
    [/CODE]

    Je ne sais pas si j'ai été clair; le problème me semble simple mais je ne sais pas comment faire simplement pour résoudre ça de façon automatique dans un fichier pouvant contenir un nombre d'informations relativement important.
    Si quelqu'un pouvait me donner un indice, ce serait sympa!
    Je vous en remercie par avance.

  2. #2
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    C'est quoi ce grep -A?

  3. #3
    Membre averti
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Par défaut
    Euh en fait, je viens de me rendre compte que j'ai oublié un paramètre dans cette commande, j'étais un peu étourdi quand je l'ai écrit. Ca ressemble plutôt à ça.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -A 3 "Lost" *ping* > "file_ping.txt"
    En fait, ça me récupère les 3 prochaines lignes à partir de la première occurrence de "Lost" en incluant cette ligne. Dans mon cas, vu que je sais que je veux récupérer la perte et les min et autres et que, en théorie, les fichiers ont la même structure, ça fait que je récupère les lignes contenant tous les paramètres que je veux.
    Par contre, si il y a un souci et que le ping foire, les min, max, jitter et average sont pas dispos vu que y'a que des Request time out...et du coup, je n'ai que la perte et c'est tout. Et en fait, c'est un peu ça qui m'embête!
    Voilà!

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Lorsqu'il s'agit d'un traitement un peu complexe, la commande awk offre un code clair et concis. Je regarderai ça quand j'aurai un peu de temps (ce soir?)...

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bon, j'imagine que fichier_entree est de la forme:
    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
    --
    Packets: Sent: 20, Received:20, Lost=0 (0%loss)
    Approximate time in milli-seconds
    Minimum=2.40ms, Maximum=3.20ms, Average=3.01ms, Jitter statistical=1.49ms
    --
    Packets: Sent: 20, Received:20, Lost 0 (0%loss)
    Approximate time in milli-seconds
    Minimum=2.32ms, Maximum=3.10ms, Average=2.98ms, Jitter statistical=1.25ms
    --
    Packets: Sent: 20, Received:0, Lost 0 (100%loss)
    --
    Packets: Sent: 20, Received:20, Lost 0 (0%loss)
    Approximate time in milli-seconds
    Minimum=2.32ms, Maximum=3.10ms, Average=2.98ms, Jitter statistical=1.25ms
    --
    Le code pour extraire ce que tu veux en utilisant awk est le suivant:
    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
    awk '
    {
      if ($0 ~ /%loss)$/)
      {
        split($NF, loss, "[(%]")
        if (loss[2] == 100)
        {
          print "100%"
        }
        else
        {
          getline
          getline
          split($1, a, "="); split(a[2], min, "m")
          split($2, a, "="); split(a[2], max, "m")
          split($3, a, "="); split(a[2], ave, "m")
          split($NF, a, "="); split(a[2], jit, "m")
          print loss[2] "%", min[1], max[1], ave[1], jit[1]
        }
      }
    }' fichier_entree

Discussions similaires

  1. [XPATH] problème lecture dans fichier XML
    Par DiamonDonald dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 26/02/2008, 09h57
  2. Problèmes Ecriture dans Fichiers Texte
    Par JmL40 dans le forum Langage
    Réponses: 13
    Dernier message: 26/09/2007, 14h04
  3. [AJAX] Fichier ASP appelé par AJAX
    Par dragonfly dans le forum Général JavaScript
    Réponses: 24
    Dernier message: 14/06/2007, 11h14
  4. Réponses: 13
    Dernier message: 24/10/2006, 14h17
  5. problème path dans fichier zip
    Par jpastier dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 20/05/2006, 16h06

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