Pratique de pouvoir rechercher ou valider une adresse MAC avec une commande shell, et comme grep supporte très bien les expressions régulières cela est même facile à utiliser.

Pour construire notre expression régulière, il faut réfléchir sur ce que nous cherchons. Une adresse mac est toujours représentée comme suit: XX:XX:XX:XX:XX:XX soit 6 champs de 2 caractères. Mais il y a le séparateur ":" que nous devons aussi prendre en compte. Le plus simple est de ce dire que nous cherchons en fait 5 blocs de 2 caractères suivit du ":" avec à la fin un bloc de 2 caractères.

Concernant les caractères constituant nos blocs, vu qu'il s'agit en fait d'une notation hexadécimale, il faut aussi en tenir compte. Pas la peine par exemple de rechercher toute lettre de l'alphabet, l'hexadécimal s'arrête à F. Nous pouvons aussi avoir des chiffres de 0 à 9. Pour signifier en expression régulière que nous recherchons des chiffres de 0 à 9 il faut utiliser la syntaxe suivante:

[0-9]

Pour les lettres de A à F celle-ci:

[A-F]

Il suffit de mélanger les 2 pour avoir la plage hexadécimale de 0 à F, et nous allons rajouter les minuscules, ce qui donne:

[0-9a-fA-F]

Cette expression donne un résultat dès qu'elle tombe sur un chiffre de 0 à 9, ou 1 lettre de a à f, ou 1 lettre de A à F. C'est déjà un bon début.

Pour indiquer dans une expression régulière le nombre d'occurrence que nous recherchons, il suffit de préciser ce nombre entre accolade. Nos blocs sont toujours constitués de 2 caractères, donc:

[0-9a-fA-F]{2}

Il nous manque plus que le séparateur ":" qui est un caractère spéciaux en expression régulière, il faut donc l'échapper avec \. Notre premier bloc sera donc:

[0-9a-fA-F]{2}\:

Ce premier bloc dans une adresse mac est présent 5 fois, nous allons donc dire que tout ce bloc doit être vu 5 fois de suite. Pour délimiter un bloc, il faut utiliser les parenthèses:

([0-9a-fA-F]{2}\:){5}

Nous terminons avec le dernier bloc, qui est en fait similaire au premier mais sans le séparateur:

([0-9a-fA-F]{2}

L'expression régulière complète est donc:

([0-9a-fA-F]{2}\:){5}[0-9a-fA-F]{2}

Nous pouvons la tester avec grep et l'option -E ou directement avec la commande egrep. Par exemple sur les fichiers de configuration réseau d'une Fedora:

cd /etc/sysconfig/network-scripts/
egrep -ho "([0-9a-fA-F]{2}\:){5}[0-9a-fA-F]{2}" ifcfg-eth*

options: -h pour ne pas indiquer le nom du fichier et -o pour n'afficher que ce qui correspond au résultat et non toute la ligne complète