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 :

Substitution élément adresse mac depuis variable


Sujet :

Shell et commandes GNU

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut Substitution élément adresse mac depuis variable
    Bonjour,

    Je poste ici après qques heures de galère avec sed, awk, cut, grep... les scripts bash c'est décidément pas mon fort (mais ça a l'air biiiiien)

    Le problème: j'ai un fichier, $samplefile dans l'exemple, d'adresse mac de la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    40:1:d7:ec:96:83
    40:1:d7:ec:96:84
    Avec une centaine d'entrées.

    J'ai besoin de changer le dernier octet de l'adresse
    Avec une chaîne ou un entier, pas de soucis, ça passe avec une ligne du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $samplefile | awk -F ":" '{gsub($6, "toto");print $1":"$2":"$3":"$4":"$5":"$6}'
    Ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat $samplefile | awk -F ":" '{gsub($6, 45);print $1":"$2":"$3":"$4":"$5":"$6}'
    Par contre quand j’essaie de placer une variable à la place de toto ou 45, j'ai un résultat pas terrible, seulement la partie 'chiffre' du dernier octet s'affiche. Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #Décimal initial
    first=131
    #Pour chaque ligne
    for line in $(cat $samplefile);do
            #Je coverti mon décimal en hexa
            valhex=$(echo "obase=16; $first"|bc)
            #Je substitue mon dernier élément
            echo $line | awk -F ":" '{gsub($6, '$valhex');print $1":"$2":"$3":"$4":"$5":"$6}'
            #j'incrémente mon décimal
            ((first++))
    done
    Ma variable $valhex est bien incrémentée, de 83 à 8C pour les dix premières valeurs mais le résultat de la substiution est foireux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    40:1:d7:ec:96:83
    40:1:d7:ec:96:84
    40:1:d7:ec:96:85
    40:1:d7:ec:96:86
    40:1:d7:ec:96:87
    40:1:d7:ec:96:88
    40:1:d7:ec:96:89
    40:1:d7:ec:96:8
    40:1:d7:ec:96:8
    40:1:d7:ec:96:8
    Pour le dernier octet des adresses j'ai un 8 au lieu de 8A, 8B, 8C...

    En espérant avoir été clair, si quelqu'un a une idée, une astuce et/ou explication, je suis preneur...

    Merci!

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Il faut déclarer ta variable dans "awk" avec l'option "-v var=blabla" et employer la variable tel quel "var" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #Décimal initial
    first=131
    #Pour chaque ligne
    for line in $(cat $samplefile);do
            #Je coverti mon décimal en hexa
            valhex=$(echo "obase=16; $first"|bc)
            #Je substitue mon dernier élément
            echo $line | awk -F ":" -v val="${valhex}" '{gsub($6, 'val');print $0}'
            #j'incrémente mon décimal
            ((first++))
    done

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    Ouiiii, c'est bon ça, parfait, nickel, merci beaucoup, ça passe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $line | awk -F ":" -v val="${valhex}" '{gsub($6, 'val');print $1":"$2":"$3":"$4":"$5":"$6}'
    Merci!

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS=OFS=":"; first=131} { $6 = sprintf("%X",first); first++; print $0 }' $samplefile
    c'est tout.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 4
    Par défaut
    Houu, c'est tout en effet, très très puissant awk! Merci encore.

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 814
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par alscion Voir le message
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #Décimal initial
    first=131
    #Pour chaque ligne
    for line in $(cat $samplefile);do
            #Je coverti mon décimal en hexa
            valhex=$(echo "obase=16; $first"|bc)
            #Je substitue mon dernier élément
            echo $line | awk -F ":" '{gsub($6, '$valhex');print $1":"$2":"$3":"$4":"$5":"$6}'
            #j'incrémente mon décimal
            ((first++))
    done
    Salut

    Attention à la structure for var in $(commande). Le pb du for c'est qu'il utilise l'espace pour découper ses éléments. Or si la commande renvoie une info avec espaces, alors le for la coupera en 2 (bon cela n'arrivera pas ici car tes lignes n'ont pas d'espace mais c'est pour généraliser).

    Quand on veut traiter des lignes une à une, mieux vaut utiliser read qui utilise le <enter> pour découper les lignes (voir plus bas)

    Citation Envoyé par alscion Voir le message
    Houu, c'est tout en effet, très très puissant awk! Merci encore.
    awk est en effet très très puissant. Mais aussi très lourd (normal, puissance = lourdeur) donc lent à démarrer. Donc en lancer un une fois pour traiter tout le fichier ok. En revanche, si on doit en lancer un à chaque ligne (comme ton premier script) vaut mieux essayer d'éviter autant que possible.

    Pour info, autre possibilité en restant dans un script shell (au cas où tu aurais autre chose à faire avant ou après) et sans utiliser awk à chaque ligne...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #Décimal initial
    first=131
    #Pour chaque ligne*
    cat $samplefile | while read line; do
    	#Je convertis mon décimal en hexa (et je le mets en minuscules pour cohérence)
    	valhex=$(echo "obase=16; $first"|bc |tr '[:upper:]' '[:lower:]')
     
    	#Je substitue mon dernier élément
    	echo "$line" | sed -e "s/:[a-z,A-Z,0-9]\{1,\}$/:$valhex/"
     
    	#j'incrémente mon décimal
    	((first++))
    done
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 636
    Par défaut
    heureusement, un jour bash a été créé :
    Code bash 4.1 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    first=131
    # en admettant que le fichier samplefile ne contient qu'une adresse mac par ligne.
    while read line
    do line="${line^^}"
       printf '%s:%.2X\n' "${line%:*}" $((first++))
    done <samplefile
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Obtenir un id hardware depuis adresse mac
    Par Bourak dans le forum API, COM et SDKs
    Réponses: 0
    Dernier message: 08/10/2010, 18h01
  2. Récupérer l'adresse MAC depuis l'adresse IP
    Par dedibox26 dans le forum Réseau
    Réponses: 1
    Dernier message: 17/05/2010, 17h19
  3. Obtenir l'adresse Mac depuis l'adresse IP
    Par djibril dans le forum Réseau
    Réponses: 4
    Dernier message: 04/02/2010, 17h21
  4. Réponses: 5
    Dernier message: 25/03/2003, 17h27
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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