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 :

Script bash qui compte depuis un fichier log le nombre d'arguments x qui 'matchent' n adresse ip données


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut Script bash qui compte depuis un fichier log le nombre d'arguments x qui 'matchent' n adresse ip données
    Bonjour à tous,

    Depuis plusieurs jours je bloque sur un script bash, je débute et je ne suis pas très calé en la matière. Je sollicite donc l'aide des pros qui ont l'habitude et plus d'expertise que moi dans le domaine

    Je vous présente donc ce que j'ai déjà fait et ce sur quoi je bloque :

    1/ J'ai tout d'abord un fichier .txt dans lequel j'ai listé tout bêtement des adresses IP d'équipements réseaux (des Voice Gateway, "VG" de marque Cisco, ce sont des passerelles analogique-numérique en ToIP et servent à brancher des téléphones analogiques ou fax sur une infra IP). Mon fichier s'appelle vglist.txt et ressemble à ce qui suit, c'est sous forme texte brut. (vous pourriez tout à fait imaginer faire la même chose sur un switch en récupérant un autre type de données...)

    10.5.8.23
    10.5.4.171
    10.5.4.34

    2/ Ensuite j'ai un script .sh qui s'appelle "tache1.sh" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
    # demande des mots de passe (il y en a 2 sur les équipements Cisco) :
    echo -n "Quel est le mot de passe ? "
    read -s -e pass
    echo -ne '\n'
    echo -n "Mot de passe ENABLE ? "
    read -s -e enable
    echo -ne '\n'
    # Va aller chercher chaque adresse IP du fichier vglist.txt et executer un script Expect en balançant les mots de passe saisis juste avant (voir ci-après le script Expect en 3/)
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
     done

    3/ Enfin mon script Expect "programme_vg.exp" (Expect ressemble à TCL), il permet d'injecter des commandes Cisco sur les équipements. J'ai mis l'extension .exp mais j'aurais pu aussi mettre .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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/expect -f
     
    # Variables
     set hostname [lindex $argv 0]
     set pass [lindex $argv 1]
     set enable [lindex $argv 2]
     set timeout 5
     
    # Fichier de sortie pour les resultats
     log_file -a ./resultat.log
     
    # Annonce sur quel équipement on travaille et date-heure
     send_user "\n"
     send_user ">>>>> , $hostname , Date :, [exec date] , <<<<<\n"
     send_user "\n"
     
    # invoque telnet
    spawn telnet $hostname
     
    # Injecte les deux mots de passe
      expect ">"
      send "$pass\n"
        send "en\n"
        expect "Password:"
        send "$enable\n"
     
    # Envoie la commance cisco
    send "sh voice port sum | section incl up\n"
     
    expect "#\r"
    send "exit\n"
    exit
    Vous remarquerez que ce script fait appel à /usr/bin/expect, mais peu importe.
    Donc en lançant tache1.sh j'obtiens l'affichage ci-dessous, enregistré dans un fichier de sortie "resultat.log"


    # vi resultat.log

    >>>>> , 10.5.8.23 , Date :, sam. mars 24 15:12:03 CET 2018 , <<<<<

    spawn telnet 10.5.8.23^M
    Trying 10.5.8.23...^M^M
    Connected to 10.5.8.23.^M^M
    Escape character is '^]'.^M^M
    ^M
    ****************************************************^M
    ^M
    vg-aaa^M
    Unauthorized access to this system is forbidden and will be^M
    prosecuted by law.^M
    ****************************************************^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-aaa>en^M
    Password: ^M
    vg-aaa#sh voice port sum | section incl up^M
    2/0 -- fxs-ls up dorm on-hook idle y ^M
    2/2 -- fxs-ls up dorm on-hook idle y ^M
    2/5 -- fxs-ls up dorm on-hook idle y ^M
    2/6 -- fxs-ls up dorm on-hook idle y ^M
    2/7 -- fxs-ls up dorm on-hook idle y ^M
    2/8 -- fxs-ls up dorm on-hook idle y ^M
    2/9 -- fxs-ls up dorm on-hook idle y ^M
    2/10 -- fxs-ls up dorm on-hook idle y ^M
    2/11 -- fxs-ls up dorm on-hook idle y ^M
    2/12 -- fxs-ls up dorm on-hook idle y ^M
    2/13 -- fxs-ls up dorm on-hook idle y ^M
    2/14 -- fxs-ls up dorm on-hook idle y ^M
    vg-aaa#
    >>>>> , 10.5.4.171 , Date :, sam. mars 24 15:12:13 CET 2018 , <<<<<

    spawn telnet 10.5.4.171^M
    Trying 10.5.4.171...^M^M
    Connected to 10.5.4.171.^M^M
    Escape character is '^]'.^M^M
    ^M
    ****************************************************^M
    ^M
    vg-bbb^M
    Unauthorized access to this system is forbidden and will be^M
    prosecuted by law.^M
    ****************************************************^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-bbb>en^M
    Password: ^M
    vg-bbb#sh voice port sum | section incl up^M
    2/1 -- fxs-ls up dorm on-hook idle y ^M
    2/2 -- fxs-ls up dorm on-hook idle y ^M
    2/3 -- fxs-ls up dorm on-hook idle y ^M
    2/4 -- fxs-ls up dorm on-hook idle y ^M
    2/5 -- fxs-ls up dorm on-hook idle y ^M
    2/6 -- fxs-ls up dorm on-hook idle y ^M
    2/7 -- fxs-ls up dorm on-hook idle y ^M
    2/8 -- fxs-ls up dorm on-hook idle y ^M
    2/9 -- fxs-ls up dorm on-hook idle y ^M
    2/11 -- fxs-ls up dorm on-hook idle y ^M
    2/12 -- fxs-ls up dorm on-hook idle y ^M
    2/13 -- fxs-ls up dorm on-hook idle y ^M
    2/14 -- fxs-ls up dorm on-hook idle y ^M
    2/15 -- fxs-ls up dorm on-hook idle y ^M
    2/16 -- fxs-ls up dorm on-hook idle y ^M
    2/17 -- fxs-ls up dorm on-hook idle y ^M
    2/18 -- fxs-ls up dorm on-hook idle y ^M
    2/19 -- fxs-ls up dorm on-hook idle y ^M
    2/20 -- fxs-ls up dorm on-hook idle y ^M
    2/21 -- fxs-ls up dorm on-hook idle y ^M
    2/22 -- fxs-ls up dorm on-hook idle y ^M
    2/23 -- fxs-ls up dorm on-hook idle y ^M
    ^M
    --More--
    >>>>> , 10.5.4.34 , Date :, sam. mars 24 15:12:23 CET 2018 , <<<<<

    spawn telnet 10.5.4.34^M
    Trying 10.5.4.34...^M^M
    Connected to 10.5.4.34.^M^M
    Escape character is '^]'.^M^M
    ^M
    ****************************************************^M
    ^M
    vg-ccc^M
    Unauthorized access to this system is forbidden and will be^M
    prosecuted by law.^M
    ****************************************************^M
    ^M
    ^M
    User Access Verification^M
    ^M
    Password: ^M
    vg-ccc>en^M
    Password: ^M
    vg-ccc#sh voice port sum | section incl up^M
    2/0 -- fxs-ls up dorm on-hook idle y ^M
    2/6 -- fxs-ls up dorm on-hook idle y ^M
    2/11 -- fxs-ls up dorm on-hook idle y ^M
    2/14 -- fxs-ls up dorm on-hook idle y ^M
    2/15 -- fxs-ls up dorm on-hook idle y ^M
    2/16 -- fxs-ls up dorm on-hook idle y ^M
    2/17 -- fxs-ls up dorm on-hook idle y ^M
    2/19 -- fxs-ls up dorm on-hook idle y ^M
    2/20 -- fxs-ls up dorm on-hook idle y ^M
    2/21 -- fxs-ls up dorm on-hook idle y ^M
    2/22 -- fxs-ls up dorm on-hook idle y ^M
    2/23 -- fxs-ls up dorm on-hook idle y ^M
    ^M
    vg-ccc#


    Donc le script envoie la commande sur l'équipement Cisco : show voice port summary | section include up
    ceci me remonte l'information des ports (les lignes 2/0, 2/1, 2/2, etc) qui sont UP uniquement, n'ayant pas besoin de connaitre les ports DOWN, peu importe, sinon on fait show voice port summary et ça liste tous les ports, qu'ils soient UP ou DOWN, mais j'ai voulu réduire l'info dans le log.

    => Ce que je veux c'est savoir sur tel ou tel équipement (=telle adresse IP) combien de ports sont UP

    Du coup, j'ai tous les résultats dans mon fichier log (imaginez un tel fichier avec le résultat du script pour 200 adresses IP...) mais je ne sais pas à l'aide de quelles commandes (combinaison de grep et sed ? cut ? créer un tableau ?) je peux dans un script nommé tache2.sh obtenir ce résultat :

    >>>>> , 10.5.8.23
    ports UP :
    12

    >>>>> , 10.5.4.171
    ports UP :
    22

    >>>>> , 10.5.4.34
    ports UP :
    12

    Je n'ai pas réussi à 'matcher' $vg (donc l'adresse IP) et faire un wc -l des lignes suivantes comprenant "up dorm" (mais uniquement les lignes qui concernent l'équipement donné)

    Tout ce que j'obtiens c'est un count de toutes les chaines "up dorm" du fichier resultat.log, je n'arrive pas à découper par équipement.

    La difficulté à mon avis est que pour chaque adresse IP, le nombre de lignes qui suivent varie... ce n'est pas fixe. Il faudrait pouvoir délimiter des zones de recherche de l'info pour chaque adresse IP, par exemple dire tu regardes de ">>>>> , 10.5." jusqu'au prochain ">>>>> ,"
    et là tu me fais un grep de "up dorm" et tu me fais un wc -l de cette expression, et tu me mets le résultat dans un fichier de sortie autre (que l'on incrémente avec l'information apprise précédemment jusque là).

    J'espère que j'ai été clair, j'imagine que ce que je veux faire est possible, mais je ne sais absolument pas comment, je suis vraiment débutant et je ne me rends pas compte si c'est compliqué à faire ou au contraire assez simple par le maniement de quelques commandes usuelles.

    Si vous avez des idées déjà ?

    Par avance, merci énormément
    Rico

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,



    en clair il s'agit de compter pour chaque IP le nombre de lignes consécutives qui contiennent un truc genre "fxs-ls up" et sachant que le fichier de log en question est en partie au format Windows avec des retours en CRLF

    c'est bien ça ?

    accessoirement, ce que je remarque pour 10.5.4.171 par exemple, c'est qu'on a en plein milieu un -- More -- qui traine, c'est voulu ? on est bien certain qu'il n'y a que 22 ports du coup ?

  3. #3
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Salut BufferBob,

    Merci pour la réponse rapide !

    Les balises ? mhhh.... va falloir que je cherche ce que c'est et comment mettre ça en place...

    Le fichier de sortie n'est pas au format Windows spécifiquement, c'est juste .txt mais le script tourne sur un serveur Linux, donc j'aurais pu très bien appeler mon fichier vglist sans mettre d'extension.
    C'est juste pour dire que c'est un fichier texte.

    Par contre chaque adresse IP commencera toujours par "10.5.", à partir du 3eme octet ça peut changer.

    le --More-- en plein milieu, ce n'est pas grave. En fait la commande que je lance retournera toujours les ports UP, ils seront toujours à l'affichage de manière certaine, il n'y a que 24 ports, de 2/0 à 2/23.
    Je ne sais pas pourquoi il a enregistré le More, mais justement ça montre que les affichage dans le fichier log peuvent être différents d'un équipement à l'autre.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    un truc comme ça semble fonctionner :
    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
    #!/usr/bin/awk -f
     
    /Connected/ {
       IP = substr($NF,0,length($NF)-4)
       step = 1
    }
     
    /fxs-ls up/ {
       if (step == 1) { step = 2 }
       if (step == 2) { count++; next; }
    }
     
    step == 2 {
       print IP " : " count
       count = 0; step = 0
    }
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ ./toto.awk
    10.5.8.23 : 12
    10.5.4.171 : 22
    10.5.4.34 : 12
    ---

    Citation Envoyé par Ricochets Voir le message
    Les balises ? mhhh.... va falloir que je cherche ce que c'est et comment mettre ça en place...
    tu vas y arriver, y'a plus compliqué comme pb informatique dans l'éditeur c'est une icône en forme de #

    Le fichier de sortie n'est pas au format Windows spécifiquement, c'est juste .txt mais le script tourne sur un serveur Linux
    .txt c'est une extension, mais les ^M sont caractéristiques de fins de lignes en \r\n (0x0d, 0x0a), tandis que sous Linux les fins de lignes sont uniquement des \n (0x0a), et ton fichier montre les deux, donc à priori c'est un fichier mixte, aussi bien ça ne pose aucun problème particulier, aussi bien on a vu des cas où ça en posait

    Par contre chaque adresse IP commencera toujours par "10.5.", à partir du 3eme octet ça peut changer.
    oui ou sera en fin d'une ligne contenant Connected par exemple, c'est ce sur quoi je me base dans le script

    le --More-- en plein milieu, ce n'est pas grave. En fait la commande que je lance retournera toujours les ports UP, ils seront toujours à l'affichage de manière certaine, il n'y a que 24 ports, de 2/0 à 2/23.
    Je ne sais pas pourquoi il a enregistré le More, mais justement ça montre que les affichage dans le fichier log peuvent être différents d'un équipement à l'autre.
    oui, ça montre surtout que l'affichage attendait en interactif (coucou expect) qu'on appuie sur espace pour afficher le reste, donc là tu as 22 ports affichés, aussi bien il te manque l'affichage des 2 derniers ports et tu ne t'en es pas rendu compte

  5. #5
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    ok c'est super sympa...
    (j'ai compris pour les balises, merci BufferBob je n'avais pas regardé le bandeau éditeur, désolé)

    par contre je ne comprends pas bien ton code.
    Si je copie-colle dans un nouveau fichier, déjà il ne comprend pas (et moi non plus) d'où vient /Connected/,
    (/Connected/ n'existe pas dans mon fichier log)

    il me retourne ça :

    tache2.awk: ligne3: /Connected/: Aucun fichier ou dossier de ce type
    tache2.awk: ligne4: Erreur de syntaxe près du symbole inattendu « ( »
    tache2.awk: ligne4: ` IP = substr($NF,0,length($NF)-4)'



    oui, ça montre surtout que l'affichage attendait en interactif (coucou expect) qu'on appuie sur espace pour afficher le reste, donc là tu as 22 ports affichés,
    aussi bien il te manque l'affichage des 2 derniers ports et tu ne t'en es pas rendu compte
    Tu as surement raison pour l'attente de la touche Espace, mais en l'occurence ici il ne manque rien. et en plus on voit que entre la dernière ligne de port 2/23 (qui est le dernier port de l'équipement) et le --More-- il y a une ligne blanche marquée par ^M.
    Je pense qu'on peut faire abstraction du --More-- et l'ignorer, à priori le commande me retourne le bon résultat à chaque fois.

  6. #6
    Membre habitué
    Homme Profil pro
    Gestionnaire de parc micro-informatique
    Inscrit en
    Novembre 2017
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Gestionnaire de parc micro-informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2017
    Messages : 13
    Par défaut
    Je précise, je suis sur un serveur Linux
    et fais tourner mes scripts en bash

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    La réponse de BufferBob était trop belle.

    Le shebang, sur la première ligne d'un fichier exécutable, indique le logiciel avec lequel le texte doit être interprété.
    Ici, tu as loupé #!/usr/bin/awk -f qui indique qu'il s'agit d'un script awk.

    Évidemment, si tu demandes à bash d'interpréter awk, ça ne marche pas.
    Tu pourrais, aussi, appeler la commande awk dans ton script bash.
    Mais la solution élégante est celle donnée par BufferBob : écris le script dans un fichier plat que tu nommes mon_compteur_par_ip.awk par exemple. Rends-le exécutable. Puis alimente-le avec ton script principal. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for vg in $(cat vglist.txt);do
     ./programme_vg.exp $vg $pass $enable ;
     done | mon_compteur_par_ip.awk

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Batch] commande "bash" dans PuTTY depuis un fichier batch
    Par Hanooman dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 18/07/2012, 20h11
  2. Script - ouvrir des urls depuis un fichier externe
    Par yuyu599 dans le forum Langage
    Réponses: 2
    Dernier message: 09/10/2010, 23h17
  3. Réponses: 21
    Dernier message: 29/09/2005, 19h33
  4. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27

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