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 :

Méthode - fichier temporaire ou autres


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut Méthode - fichier temporaire ou autres
    Bonjour

    Mon but est d'obtenir l'adresse MAC d'un port sur un commutateur
    je connais $adresseequipement ; $port (le nom du port - ex: Ethernet 1) ; communauteRO

    # j'interroge le switch sur OID : "BRIDGE-MIB::dot1dTpFdbPort"
    # je constitue mon fichier tampon avec comme format de sortie
    # oid = INTERGER: numduport

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    snmpwalk -v2c -c $communauteRO $adresseequipement .1.3.6.1.2.1.17.4.3.1.2 -On | awk -F ".1.3.6.1.2.1.17.4.3.1.2" {' print $2 '} |awk -F "=" {' print $1 $2'} >> fichiertampon.tmp
    resultat : (le fichier peut contenir > 1500 lignes)
    .144.251.166.22.66.156 INTEGER: 41
    .144.251.166.22.66.160 INTEGER: 23
    .144.251.166.22.66.171 INTEGER: 23

    # je recherche dans le fichier tampon le port et affecte à la variable numportsnmp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    numportsnmp=`cat fichiertampon.tmp | grep ": $port$" | awk -F" " {' print $1 '}`
    # après quelques tests sur vieillesse du fichier tampon, adresse seule
    # portx=$numportsnmp

    # j'interroge le switch sur OID : "BRIDGE-MIB::dot1dTpFdbAddress"
    # pour récupérer l'adresse MAC
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    adressemacport=`snmpget -v2c -c $communauteRO $adresseequipement .1.3.6.1.2.1.17.4.3.1.1$portx -Ouv | awk -F "STRING:" {'print $2'}`
    resultat : l'adresse MAC
    90:fb:a6:16:42:9c

    questions :
    1 - suis-je obligé de passer par un fichier tampon ?
    2 - y a t-il une méthode plus efficace ?

    d'avance merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    Bonjour,

    1 - suis-je obligé de passer par un fichier tampon ?
    non.
    2 - y a t-il une méthode plus efficace ?
    n'utilise qu'une seule instance de awk (ce n'est pas qu'un "super `cut'ter" : tuto awk), qui effectuera une sortie dans un format que le shell pourra découper pour assigner chaque partie à une variable.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut
    un peu plus d'aide me serait nécessaire car je bloque sur awk


    J'ai un fichier tampon.txt qui contient
    IP=WW.XX.YY.ZZ
    DATE=123112344234
    .0.0.72.9.88.130 INTEGER: 23
    .0.0.72.157.130.78 INTEGER: 17
    .0.0.72.211.105.190 INTEGER: 23


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #!/bin/bash
    FICHIER=tampon.txt
    #DATEFICHIER=$(cat $FICHIER | grep "DATE" | awk -F"=" {'print $2'}) #*OK
     
     
    DATEFICHIER=`awk 'BEGIN { FS="=" } /DATE/ {'print $2'}' <<<$FICHIER` #*NOK
    echo $DATEFICHIER

    merci pour votre aide

  4. #4
    Membre averti
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut
    j'ai avancé dans la compréhension d'awk donc je vous joins le résultat
    maintenant j'ai enlevé les pipes , cat et grep

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #!/bin/bash
    FICHIER=tampon.txt
    #DATEFICHIER=$(cat $FICHIER | grep "DATE" | awk -F"=" {'print $2'}) #*OK
     
    DATEFICHIER=$(awk -F"=" '/DATE/ { print $2 }' $FICHIER)  #*OK
    echo $DATEFICHIER
    pour info dans le même genre , je cherchais une variante quand le motif est une variable

    j'ai toujours le fichier tampon.txt
    .0.0.72.9.88.130 INTEGER: 23
    .0.0.72.157.130.78 INTEGER: 17
    .0.0.72.211.105.190 INTEGER: 23

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NUMPORTSNMP=$(awk -F"[: ]" '/'": ${PORT}$"'/ { print $1 } $FICHIER)
    echo $NUMPORTSNMP
    y a t-il une autre syntaxe pour la commande awk ?
    d'avance merci

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    y a t-il une autre syntaxe pour la commande awk ?
    oui : tu peux assigner une variable shell à une variable awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    port=23
    awk -F'[: ]' -vport="$port" '/port"$"/{ print $1 }' tampon.txt
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    port=23
    awk -F'[: ]' 'NF ~ port"$" { print $1 }' port="$port" tampon.txt
    ou encore, utiliser NF (le nombre de champ de la ligne) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'[: ]' '$NF == port { print $NF }' port="23" tampon.txt
    as-tu besoin de ce fichier temporaire plus loin dans ton script ? sinon (re)pipe snmpwalk à awk.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre averti
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut
    Merci pour la réponse sur awk ( j'en suis à la commande , wc -l => ma piste est d'utiliser print NR mais j'ai des soucis avec END { ...} )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    NBREDELIGNE=`cat tampon.txt | grep ": $(PORT)$" | awk -F " " {' print $1 ' } | wc -l` # OK
    NBREDELIGNE=$(awk -F":" '/'': ${PORT}$"'/ { print $1 } END { print NR } ' tampon.txt #NOK


    j'ai fais le choix d'avoir un fichier temporaire car pour la mise au point de mon script
    918 lignes (dont 200 de commentaire ,debug)
    cela permet de ne pas à chaque fois que j'exécute le script (faire un test) de faire une requête snmpwalk sur l'équipement en prod , et c'est plus réaliste car j'ai des adresses MAC sur presque tout les ports , ce que je n'aurais pas sur une maquette.

    au bout d'une heure , je renouvelle mon fichier tampon.txt car certaines adresseMAC ne sont plus présente et la suite du script plante

    par contre quand la mise au point sera terminé , j'envisage peux être de supprimer ce fichier temporaire.

    question :
    je ne sais pas si on gagne beaucoup en temps d'accès , entre une variable et un fichier temporaire sur un ramdisk ?

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 660
    Par défaut
    j'en suis à la commande , wc -l => ma piste est d'utiliser print NR mais j'ai des soucis avec END { ...}
    mais encore ...
    s'il s'agit de compter le nombre de lignes qui correspondent, il faut incrémenter une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nbLigne=$(awk -F":" '/'': ${PORT}$"'/ { n++ } END { print n } ' tampon.txt)
    les noms de variables en majuscules sont reservés aux variables d'environnement (HOME, PATH,...).
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Homme Profil pro
    Loisir / Plaisir
    Inscrit en
    Février 2012
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Jura (Franche Comté)

    Informations professionnelles :
    Activité : Loisir / Plaisir

    Informations forums :
    Inscription : Février 2012
    Messages : 32
    Par défaut
    je mis perds un peu entre les différents ' " { ( de awk

    quand utilise t-on BEGIN { FS="XY" } à la place de -F

    quand à la casse des variables , fonctions ... ou trouve t-on les bonnes pratiquent

    un mélange comme nbLigne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nbLigne=$(awk -F":" '/'': ${PORT}$"'/ { n++ } END { print n } ' tampon.txt)
    ou toutes les variables en minuscule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nbligne=$(awk -F":" '/'': ${port}$"'/ { n++ } END { print n } ' tampon.txt)
    d'avance merci

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 17/11/2009, 15h00
  2. Réponses: 1
    Dernier message: 13/06/2006, 17h41
  3. Réponses: 9
    Dernier message: 19/08/2004, 11h03
  4. Réponses: 2
    Dernier message: 02/07/2004, 13h46
  5. [LG]Ecrire le contenu d'un fichier dans un autre
    Par lucke dans le forum Langage
    Réponses: 10
    Dernier message: 26/04/2003, 20h48

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