OVH Cloud OVH Cloud

regexp et MAC address

6 réponses
Avatar
Doug713705
Bonjour à toutes, tous,

J'écris un script en bash et j'ai besoin de retrouver dans la sortie d'un
autre script uniquement les "mots" qui sont des adresses MAC. (Pour
simuler, on peut essayer sur la sortie de ifconfig et récuperer les
HWaddr )

J'ai pensé à utiliser grep et une expression régulière mais je n'arrive
vraiment pas a construire cette expression régulière.

J'aurais bien voulu apprendre à construire des expressions régulières mais
je n'ai trouver aucun howto français ou anglais réellement complet (ou
plutôt suffisamment explicite pour quelqu'un comme moi) et la page de man
de grep ne m'a pas aidé.

Merci de votre aide.

--
@+
Doug [Linux user #307925] - Slackware RuleZ ;-)
[Pourquoi t'es qui, qu'est ce que tu fais par où ?]
-- Pour me contacter enlever no-spam (2X) --

6 réponses

Avatar
Stephane Chazelas
On Mon, 09 Jan 2006 11:58:27 +0100, Doug713705 wrote:
Bonjour à toutes, tous,

J'écris un script en bash et j'ai besoin de retrouver dans la sortie d'un
autre script uniquement les "mots" qui sont des adresses MAC. (Pour
simuler, on peut essayer sur la sortie de ifconfig et récuperer les
HWaddr )

J'ai pensé à utiliser grep et une expression régulière mais je n'arrive
vraiment pas a construire cette expression régulière.
[...]


Avec perl:

ifconfig -a | perl -lne '
print for (
/(b(?:[[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}b)/
)'

Ou avec GNU grep:

grep -woE '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

regarde du coté de man/info regex/regexp (les pages de Solaris
sont assez bien faites). Il doit y avoir de tonnes de tutoriels
sur le web aussi.

perldoc perlre

pour perl.

--
Stephane

Avatar
Doug713705
Le Lundi 9 Janvier 2006 12:32, Stephane Chazelas s'est exprimé de la sorte
sur fr.comp.os.unix :

grep -woE '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'


Merci, c'est exactement ce qu'il me fallait mais je n'arrive pas encore à
comprendre comment tu as fais pour arriver à une telle expression.

Je vais analyser tout ça et lire, lire....

Merci encore.

--
@+
Doug [Linux user #307925] - Slackware RuleZ ;-)
[Pourquoi t'es qui, qu'est ce que tu fais par où ?]
-- Pour me contacter enlever no-spam (2X) --

Avatar
mdnews

Le Lundi 9 Janvier 2006 12:32, Stephane Chazelas s'est exprimé de la sorte
sur fr.comp.os.unix :

grep -woE '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'


Merci, c'est exactement ce qu'il me fallait mais je n'arrive pas encore à
comprendre comment tu as fais pour arriver à une telle expression.



Une variante facile à (re)lire, et compatible quelque soit l'outils

([0-9abcdef]{2}:){5}[0-9abcdef]{2}

Je vais analyser tout ça et lire, lire....


Se lit comme
- une suite de deux chiffres (0 à 9) et/ou lettres 'abcdef' (hexa)
- suivi de deux points (:)
- répété 5 fois
- et encore une fois une suite de deux chiffres/lettres

Il existe un tas de manière de bâtir une RegEx, mais toujours privilégier
celle qui n'utilise aucune spécificité OS et celle qui est le plus lisible
pour assurer une maintenance facile :-)


Avatar
Stephane Chazelas
On Mon, 9 Jan 2006 13:30:55 +0100, mdnews wrote:

Le Lundi 9 Janvier 2006 12:32, Stephane Chazelas s'est exprimé de la sorte
sur fr.comp.os.unix :

grep -woE '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'


Merci, c'est exactement ce qu'il me fallait mais je n'arrive pas encore à
comprendre comment tu as fais pour arriver à une telle expression.



Une variante facile à (re)lire, et compatible quelque soit l'outils

([0-9abcdef]{2}:){5}[0-9abcdef]{2}


Ce n'est pas compatible quelque soit l'outil. Il faut que
l'outil reconnaisse les expressions rationnelles etendues. Et il
manque les A-F. A noter que awk est censé implementer les ERE
mais certains comme GNU awk ne reconnaissent pas les {...} (a
moins de passer l'option appropriee avec gawk)

([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2} est une ERE POSIX. Ce
qui n'est pas POSIX est -w et -o.

[:xdigit:] serait plutot equivalent a 0-9a-fA-F

Je vais analyser tout ça et lire, lire....


Se lit comme
- une suite de deux chiffres (0 à 9) et/ou lettres 'abcdef' (hexa)
- suivi de deux points (:)
- répété 5 fois
- et encore une fois une suite de deux chiffres/lettres

Il existe un tas de manière de bâtir une RegEx, mais toujours privilégier
celle qui n'utilise aucune spécificité OS et celle qui est le plus lisible
pour assurer une maintenance facile :-)


En BRE (comme pour sed)

([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}

--
Stephane



Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

On Mon, 9 Jan 2006 13:30:55 +0100, mdnews wrote:
Une variante facile à (re)lire, et compatible quelque soit l'outils

([0-9abcdef]{2}:){5}[0-9abcdef]{2}


Ce n'est pas compatible quelque soit l'outil. Il faut que
l'outil reconnaisse les expressions rationnelles etendues. Et il
manque les A-F.


D'autre part, est-on sûr que [0-9] est équivalent à [0123456789]
dans toute locale?

[:xdigit:] serait plutot equivalent a 0-9a-fA-F


[0123456789abcdefABCDEF]

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / SPACES project at LORIA


Avatar
Doug713705
Le Mardi 10 Janvier 2006 16:11, Vincent Lefevre s'est exprimé de la sorte
sur fr.comp.os.unix :

Dans l'article ,
Stephane Chazelas écrit:

On Mon, 9 Jan 2006 13:30:55 +0100, mdnews wrote:
Une variante facile à (re)lire, et compatible quelque soit l'outils

([0-9abcdef]{2}:){5}[0-9abcdef]{2}


Ce n'est pas compatible quelque soit l'outil. Il faut que
l'outil reconnaisse les expressions rationnelles etendues. Et il
manque les A-F.


D'autre part, est-on sûr que [0-9] est équivalent à [0123456789]
dans toute locale?

[:xdigit:] serait plutot equivalent a 0-9a-fA-F


[0123456789abcdefABCDEF]





Merci à tous.

Je n'arrivais pas à mettre en forme mon expression (je débute, 'faut pas
m'en vouloir), c'est le : (deux points) qui me génait surtout.

--
@+
Doug [Linux user #307925] - Slackware RuleZ ;-)
[Pourquoi t'es qui, qu'est ce que tu fais par où ?]
-- Pour me contacter enlever no-spam (2X) --