Ne sortir que l'adresse MAC sur Ubuntu


36

Sous Ubuntu, avec la commande ifconfig -a, j'obtiens toutes les informations sur mes interfaces Ethernet / wifi.

Mais je dois obtenir en sortie uniquement l'adresse MAC, comme:

ab:cd:ef:12:34:56
57:89:12:34:ac:23
12:34:56:ab:cd:ef

Comment puis-je l'obtenir?

Réponses:


41

Le moyen le plus simple serait d’utiliser grepavec PCRE:

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -Pnous permettra d'utiliser perldes regex compatibles

  • grep -o ne prendra que la partie correspondante de la ligne

  • Nous avons identifié HWaddravant notre correspondance désirée (adresses MAC), puis jeter HWaddrpar \Kd'imprimer uniquement les adresses MAC.

@Helio a mentionné un point important, cela dépend fortement de votre langue, c'est-à-dire des localeparamètres. Pour surmonter cela, vous pouvez utiliser les Cparamètres régionaux (utilise le jeu de caractères ASCII) pour cette commande uniquement:

$ LANG=C ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  

2
Vous pouvez utiliser LANG=C ifconfig -aau lieu de ifconfig -apour des installations non anglaises, peut avoir des problèmes avec grep. (c'est-à-dire dans mon système, HWaddrc'est direcciónHW)
Helio

@Helio si vous tapez: ifconfig -a | grep -i hw-*?
JoKeR

1
@JoKeR juste curieux - est-ce -*censé vouloir dire quelque chose?
Muru

@muru pas vraiment je me suis confus je pensais qu'il ne pouvait pas trouver HWmais il a dit sur HWaddret espagnol comme je suppose / voir direcciónHWdonc c'est tout simplement HWpossible;)
JoKeR

Perl regex in grep"est hautement expérimental". Si vous souhaitez utiliser regex de base, la commande équivalente est ifconfig -a | grep -o 'HWaddr [[:xdigit:]:]*'ou, si vous préférez, ifconfig -a | grep -o 'HWaddr [a-f0-9:]*'. J'ai omis la fin $car la sortie inclut des espaces après l'adresse MAC et vous ne voulez probablement pas ceux-ci.
Paddy Landau

67

Vous pouvez accéder au addressfichier pour chaque périphérique du /syssystème de fichiers virtuel. L'adresse MAC doit être dans /sys/class/net/<device-name>/address:

$ cat /sys/class/net/enp1s0/address
34:17:eb:5d:88:7c

Pour tous les appareils:

$ cat /sys/class/net/*/address
34:17:eb:5d:88:7c
00:00:00:00:00:00
64:5a:04:69:50:45

6
+1 pour ne pas utiliser un outil obsolète depuis une décennie :)
hobbs

@ Hobbs Attendez, quel outil est-ce?
Détly

@detly ifconfig
hobbs

1
@ Hobbs Woah. Je n'étais pas au courant de ça. Il n’imprime pas l’avertissement de dépréciation sur ma machine.
Détly

1
@detly ifconfig est obsolète depuis des années et ipexiste depuis des années.
Muru

11

Voici quelques façons:

  1. grep. Il existe diverses expressions régulières qui vont les chercher. Ici, je cherche 5 répétitions de 2 lettres ou chiffres suivis de deux points, puis de deux caractères quelconques. Cela -irend la correspondance insensible à la casse et ne -opermet d' grepimprimer que la partie correspondante. -Eactive les expressions régulières étendues. La même expression régulière fonctionne également avec PCRE ( -P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sed. La -nsupprime la sortie normale et -ractive les expressions régulières étendues. En utilisant la même expression régulière que ci-dessus, ce script tentera de remplacer tout ce qui se trouve sur la ligne par la partie de celle-ci qui correspond à l'expression régulière. Si la substitution a réussi, la ligne résultante est imprimée (en raison de pla fin de la substitution).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awk. Si la ligne commence par un mot ( [a-zA-Z0-9_]) et comporte 5 champs, imprimez le dernier.

    ifconfig -a | awk '/^\w/&&NF==5{print $NF}'
    
  4. Perl, où, comme d'habitude, il y a plus d'une façon de le faire. Celui-ci est la même logique que awkci - dessus. Le -asigne à Perl de scinder chaque ligne d'entrée dans le @Ftableau.

    ifconfig -a | perl -lane 'if(/^\w/&&$#F==4){print $F[$#F]}'
    

    Sinon, vous pouvez utiliser l'expression régulière des approches précédentes:

    ifconfig -a | perl -lne '/(([a-z0-9]{2}:){5}..)/ && print $1'
    
  5. Coreutils.

    LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
    

6

Comme certains l'ont commenté, il ifconfigest déconseillé en faveur de la ipcommande. Donc, combinant les différentes solutions et commentaires, j'utiliserais:

$ LANG=C ip link show | awk '/link\/ether/ {print $2}'
FF:FF:FF:FF:FF:FF

4

ifconfig -a | grep HWaddr | awk '{print $5}'

Si la sortie de votre système n'est pas en anglais dans cette commande, il est logique de l'exécuter de cette façon.

LANG=C ifconfig -a | grep HWaddr | awk '{print $5}'

Ceci est applicable à toutes les solutions.


5
Au lieu d'utiliser , grepvous pouvez filtrer séparément avec awkdirectement comme celui - ci: ifconfig -a | awk '/HWaddr/ { print $5 }'
KRT

Oui, il y a vraiment beaucoup de façons de faire cela.
Pilot6

2
Vous pouvez utiliser à la LANG=C ifconfig -aplace de ifconfig -apour des installations non anglaises, des problèmes avec grep. (c'est-à-dire dans mon système, HWaddrc'est direcciónHW)
Helio

Bon avis. Mais dans mon installation russe, c'est toujours HWaddr.
Pilot6

Votre installation russe est peut-être, mais pas mon installation espagnole. ;-) Cela peut être un gros problème. S'il vous plaît, mettez @Helioau début du commentaire. Sinon, je ne serai pas averti.
Helio
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.