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?

simone_s1994
la source

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  
heemayl
la source
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
muru
la source
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
    
terdon
la source
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
utilisateur352726
la source
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.

Pilote6
la source
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