54 votes

Sortie uniquement de l'adresse MAC sur Ubuntu

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

Mais j'ai besoin d'obtenir comme résultat seulement 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 ?

120voto

muru Points 180007

Vous pouvez accéder à la address pour chaque périphérique sur le /sys systè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

49voto

heemayl Points 85741

Le moyen le plus simple serait d'utiliser grep avec le PCRE :

$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13  
  • grep -P nous permettra d'utiliser perl Regex compatible

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

  • Nous avons fait correspondre HWaddr avant notre correspondance souhaitée (adresses MAC) et ensuite rejeter HWaddr par \K pour imprimer uniquement les adresses MAC.

@Helio a mentionné un point important, cela dépend fortement de votre langue, c'est-à-dire locale paramètres. Pour y remédier, vous pouvez utiliser la fonction C locale (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

13voto

Stewart Points 1385

En voici quelques exemples :

  1. grep . Il existe plusieurs expressions régulières qui les détectent. Ici, je recherche 5 répétitions de 2 lettres ou chiffres suivis de deux points, puis de deux caractères quelconques. Le site -i rend la correspondance insensible à la casse et l'option -o fait grep n'imprime que la partie appariée. -E permet d'utiliser des expressions régulières étendues. La même expression régulière fonctionne également avec les PCRE ( -P ).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
  2. sed . Le site -n supprime la sortie normale et le -r active 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 qui correspond à l'expression régulière. Si la substitution est réussie, la ligne résultante est imprimée (à cause de l'attribut p à la fin de la substitution).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
  3. awk . Si la ligne commence par un caractère de mot ( [a-zA-Z0-9_] ), et a 5 champs, imprimer 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 faire. Celle-ci relève de la même logique que la awk ci-dessus. Le site -a indique à perl de diviser chaque ligne d'entrée dans le format @F le tableau.

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

    Alternativement, vous pouvez utiliser la regex 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

10voto

user352726 Points 163

Comme certains l'ont commenté, ifconfig est déprécié au profit de l'option ip commandement. Donc en 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

4voto

user167850 Points 230

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.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X