Forum Programmation.shell Formattage de requettes snmp, probleme de sed

Posté par  .
Étiquettes : aucune
0
22
nov.
2005
Bonjour, j'ai un probleme avec sed.

J'ai un script qui fais un requette snmp:

snmpwalk -c `community` -v 1 monequip ipNetToMediaPhysAddress

et qui me retourne:

IP-MIB::ipNetToMediaPhysAddress.1.10.10.1.1 = STRING: 0:50:53:e7:9b:ff
IP-MIB::ipNetToMediaPhysAddress.1.10.10.1.5 = STRING: 0:0:c:7:ac:1
IP-MIB::ipNetToMediaPhysAddress.1.10.10.1.15 = STRING: 0:50:80:48:7a:80
IP-MIB::ipNetToMediaPhysAddress.1.193.34.12.45 = STRING: 0:0:c:7:ac:1

que je transforme en

10.10.1.1 :0:50:53:e7:9b:ff:
10.10.1.5 :0:0:c:7:ac:1:
10.10.1.15 :0:50:80:48:7a:80:
193.34.12.45 :0:0:c:7:ac:1:

avec la commande:

snmpwalk -c `community` -v 1 monequip ipNetToMediaPhysAddress | awk -F "." '{print $3"."$4"."$5"."$6":"}' | sed "s/ = STRING: / :/g"

j'ai fait un script qui le retourne les mac adresses formatté,
mais c'est vraiment crade.
Le probleme, est que les mac addresse comme celle la:

0:0:c:7:ac:1 devrait ressembler a ça
00:00:0c:07:ac:01

Quand le charactere est inferieur à "10", il ne l'affiche que sur un charactere...

Cette solution est tres laide je trouve...

snmpwalk -c $community -v 1 monequip ipNetToMediaPhysAddress | awk -F "." '{print $3"."$4"."$5"."$6":"}' | sed 's/ = STRING: / :/g' | sed 's/:0:/:00:/g' | sed 's/:1:/:01:/g' | sed 's/:2:/:02:/g' | sed 's/:3:/:03:/g' | sed 's/:4:/:04:/g' | sed 's/:5:/:05:/g' | sed 's/:6:/:06:/g' | sed 's/:7:/:07:/g'... etc

Existe t'il quelque chose de plus propre en bash...?


Merci d'avance
  • # printf

    Posté par  . Évalué à 3.

    En utilisant printf au lieu de print tu peux te passer des sed qui ajoutent un 0.

    snmpwalk -c $community -v 1 monequip ipNetToMediaPhysAddress | awk -F "." '{printf "%02d.%02d.%02d.%02d:\n",$3,$4,$5,$6}' | sed 's/ = STRING: / :/g'

    PS: On peut utiliser un seul sed avec l'option -e:

    sed -e 's/ = STRING: / :/g' -e 's/:0:/:00:/g' -e 's/:1:/:01:/g' -e 's/:2:/:02:/g' -e 's/:3:/:03:/g'

    au lieu de

    sed 's/ = STRING: / :/g' | sed 's/:0:/:00:/g' | sed 's/:1:/:01:/g' | sed 's/:2:/:02:/g' | sed 's/:3:/:03:/g'
    • [^] # Re: printf

      Posté par  . Évalué à 2.

      ça fonctionne pas chez moi...

      Il me retourne que l'adresse ip...

      c'est quoi le \n...?
      • [^] # Re: printf

        Posté par  . Évalué à 2.

        Oublie cette réponse avec printf.
        Comme je n'ai pas ton équipement, j'ai cru qu'adresse MAC était traitée par le print dans awk ce qui n'est manifestement pas le cas. J'ai répondu plus bas pour le reformatage de l'adresse MAC avec sed.
        \n siginifie "newline" (passage à la ligne suivante). printf est utile pour faire des impressions plus sophistiquées que print (voir 'man awk')
        • [^] # Re: printf

          Posté par  . Évalué à 2.

          Merci, c'est super, ta reponse plus bas marche nickel.
  • # nouveau probleme

    Posté par  . Évalué à 2.

    En plus, je m'aperçois que le changement n'est pas fait sur toute
    la ligne...

    echo :0:0:c:7:ac:1: | sed 's/:0:/:00:/g'

    devient

    :00:0:c:7:ac:1: et non
    :00:00:c:7:ac:1: comme ça devrait etre avec le
    flag g dans la commande sed...
    • [^] # Re: nouveau probleme

      Posté par  . Évalué à 3.

      Pour que ça marche, il faut répéter le sed.
      Pour traiter tous les chiffres, tu peux utiliser la commande:

      echo :0:0:c:7:ac:1: | sed 's/:\([0-9a-f]\):/:0\1:/g' | sed 's/:\([0-9a-f]\):/:0\1:/g'

      qui donne comme résultat:

      :00:00:0c:07:ac:01:

      Il faut répéter la commande sed car chaque caractère en entrée n'est traité qu'une fois. Si on prend la chaine de caractères :0:1:, le premier traitement prend bien en compte les trois caractères :0: mais il ne reste ensuite que 1: qui ne peut pas être reconnu.
      Le premier sed va donc traiter au mieux un octet sur deux et le second les autres.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.