ifconfig | grep -oP "(?<=inet addr:).*?(?= Bcast)"
Lorsque vous utilisez grep pour extraire une partie d'une ligne (comme le font certaines autres réponses), les assertions perl look-ahead et look-behind sont vos amies.
L'explication rapide est que le premier (?<=inet addr:)
et enfin (?= Bcast)
Les parenthèses contiennent des motifs qui doivent être recherchés, mais les caractères qui correspondent à ces motifs ne seront pas renvoyés par grep, seulement les caractères qui sont entre les deux modèles et faire correspondre le modèle .*?
qui se trouve entre les jeux de parenthèses, sont retournés.
Exemple de sortie ifconfig :
eth0 Link encap:Ethernet HWaddr d0:67:e5:3f:b7:d3
inet addr:10.0.0.114 Bcast:10.0.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1392392 errors:0 dropped:0 overruns:0 frame:0
TX packets:1197193 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1294730881 (1.2 GB) TX bytes:167208753 (167.2 MB)
Interrupt:18
Cela va extraire votre adresse IP de la sortie d'ifconfig :
ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)"
Pour l'assigner à une variable, utilisez ceci :
ip=$(ifconfig | grep -oP "(?<=inet addr:).*?(?=Bcast)")
Une explication un peu plus approfondie :
De man grep :
-o
Imprimer seulement les parties correspondantes (non vides) des lignes correspondantes, avec chacune de ces parties sur une ligne de sortie séparée.
-P
Interpréter le motif comme une expression régulière Perl. Ceci est hautement expérimental et 'grep -P' peut signaler des fonctionnalités non implémentées.
De permonks.org :
(?<=pattern)
est une assertion positive de type look-behind
(?=pattern)
est une assertion positive de look-ahead
-o
Indique à grep de ne retourner que la partie de la ligne qui correspond au motif. Les look-behinds/aheads ne sont pas considérés par grep comme faisant partie du motif qui est retourné. L'adresse ?
après .*
est important car nous voulons qu'il recherche le prochain look-ahead après la correspondance du motif .*, et non le dernier look-ahead. (Ce n'est pas nécessaire si nous avons ajouté une regex pour l'adresse IP au lieu de .*, mais, la lisibilité).
0 votes
Comment avez-vous ajouté les backticks ?
4 votes
Si vous mettez 4 espaces avant la ligne, c'est considéré comme du code, et les backticks ne sont pas traités