web-dev-qa-db-fra.com

Ne sortir que l'adresse MAC sur Ubuntu

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

Mais je dois obtenir en sortie 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?

25
simone_s1994

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

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

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

  • Nous avons apparié HWaddravant la correspondance souhaitée (adresses MAC), puis nous avons abandonné HWaddrde \K pour imprimer uniquement les adresses MAC.

@Helio a mentionné un point important, cela dépend fortement de vos paramètres de langue, à savoir localename__. Pour surmonter ce problème, vous pouvez utiliser les paramètres régionaux C(utilise ASCII jeu de caractères) uniquement pour cette commande:

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

Vous pouvez accéder au fichier address de chaque périphérique sur le système de fichiers /sys. 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
52
muru

Voici quelques façons:

  1. grepname__. 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. Le -i rend la correspondance insensible à la casse et le -o fait que grepimprime uniquement la partie correspondante. -E active les expressions régulières étendues. La même expression rationnelle fonctionne également avec les PCRE (-P).

    ifconfig -a | grep -ioE '([a-z0-9]{2}:){5}..'
    
  2. sedname__. -n supprime la sortie normale et -r active les expressions régulières étendues. En utilisant la même expression rationnelle 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 pà la fin de la substitution).

    ifconfig -a | sed -rn 's/.*(([a-z0-9]{2}:){5}..).*/\1/p'
    
  3. awkname__. Si la ligne commence par un caractère Word ([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 le awkci-dessus. Le -a indique à Perl de scinder chaque ligne d'entrée dans le tableau @F.

    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
    
9
terdon

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

Si votre commande ne présente pas la sortie anglaise 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.

4
Pilot6

Comme certains l'ont commenté, ifconfig est obsolète en faveur de la commande ip. 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
user352726