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?
Le moyen le plus simple serait d’utiliser grep
avec PCRE:
$ ifconfig -a | grep -Po 'HWaddr \K.*$'
74:d4:35:84:34:13
grep -P
nous permettra d'utiliser Perl
compatible Regex
grep -o
ne prendra que la partie correspondante de la ligne
Nous avons apparié HWaddr
avant la correspondance souhaitée (adresses MAC), puis nous avons abandonné HWaddr
de \K
pour imprimer uniquement les adresses MAC.
@Helio a mentionné un point important, cela dépend fortement de vos paramètres de langue, à savoir locale
name__. 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
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
Voici quelques façons:
grep
name__. 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 grep
imprime 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}..'
sed
name__. -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'
awk
name__. 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}'
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 awk
ci-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'
Coreutils.
LANG_ALL=C ifconfig -a | grep 'HWadd' | tr -s ' ' '\t' | cut -f 5
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.
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