web-dev-qa-db-fra.com

Extraction de l'adresse IP d'une ligne de la sortie d'ifconfig avec grep

Étant donné cette ligne tirée de ifconfig, dans mon cas:

inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255

Comment pourrait-on extraire la partie 192.168.2.13 (l'adresse IP locale), vraisemblablement avec regex?

24
JJJollyjim

Voici un moyen d'utiliser grep:

line='inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"

Résultats:

192.168.2.13
192.168.2.256

Si vous souhaitez sélectionner uniquement des adresses valides, vous pouvez utiliser:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"

Résultats:

192.168.0.255

Sinon, il suffit de sélectionner les champs souhaités avec awk, par exemple:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

echo "$line" | awk -v OFS="\n" '{ print $2, $NF }'

Résultats:

192.168.0.255
192.168.2.256


Addenda:

Limites de mots : \b

55
Steve

utiliser cette expression régulière ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?=\s*netmask)

4
burning_LEGION

vous pouvez utiliser egrep (qui est fondamentalement identique à grep -E)
dans egrep, il existe des groupes nommés pour les classes de caractères, par exemple: "digit"
(ce qui rallonge la commande dans ce cas - mais vous obtenez le point ...)

une autre chose qu'il est bon de savoir est que vous pouvez utiliser crochets à répéter un motif

ifconfig | egrep '([0-9]{1,3}\.){3}[0-9]{1,3}'

ou 

ifconfig | egrep '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'


si vous ne vous souciez que de l'adresse IP réelle, utilisez le paramètre -o pour limiter la sortie au modèle correspondant au lieu de la ligne entière:

ifconfig | egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}'

... et si vous ne voulez pas d'adresses BCast et autres, vous pouvez utiliser ce grep:

ifconfig | egrep -o 'addr:([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}' | egrep -o '[[:digit:]].*'

J'ai supposé que vous ne parliez que d'adresses IPv4

3
Jens Bayer

Juste pour ajouter un moyen alternatif:

ip addr | grep -Po '(?!(inet 127.\d.\d.1))(inet \K(\d{1,3}\.){3}\d{1,3})' 

il affichera toutes les adresses IP sauf celle de localhost.

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

2
Stefan

Je n'ai pas assez de points de réputation pour commenter, mais j'ai trouvé un bogue dans la regex "sélectionnez seulement les adresses valables" de Steve. Je ne comprends pas très bien le problème, mais je pense avoir trouvé la solution. La première commande montre le bogue; le second montre le correctif:

$ echo "test this IP: 200.1.1.1" |grep -oE "\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
$ echo "test this IP: 200.1.1.1" |grep -oE "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b"
200.1.1.1
$
1
expebition

Ce code fonctionne bien et facile aussi.

ifconfig | grep Bcast > /tmp/ip1
cat /tmp/ip1 | awk '{ print $2 }' > /tmp/ip2
sed -i 's/addr://' /tmp/ip2
IPADDRESS=$(cat /tmp/ip2)
echo "$IPADDRESS"
0
Girish KG
grep -oE "\b([0-9]{1,3}\.?){4}\b"
0
yup yup

peut-être ceci, une commande sed, juste pour le sport:

    ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'
0
Morten

Ce code fonctionne pour moi sur Raspberry Pi zero w.

(extrait wlan0: inet 192.168.x.yadresse de la sortie ifconfig)

Recherchez le motif 'inet 192' dans la sortie ifconfig et obtenez la 10ème position à l'aide du séparateur space

 $> ifconfig |grep 'inet 192'|cut -d' ' -f10

Sortie: 192.168.1.6

0
T.I.Adrian

Une façon d'utiliser sed. La première instruction supprime tous les caractères jusqu'au premier chiffre de la ligne et la deuxième instruction enregistre la première adresse IP du groupe 1 (\1) et remplace toute la ligne par celle-ci:

sed -e 's/^[^0-9]*//; s/\(\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\).*/\1/'
0
Birei

Si vous utilisez grep qui prend en charge l'expression rationnelle Perl:

(your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'
0
Kiarash Zamanifar