É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?
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
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)
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
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}
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
$
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"
grep -oE "\b([0-9]{1,3}\.?){4}\b"
peut-être ceci, une commande sed, juste pour le sport:
ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'
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
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/'
Si vous utilisez grep qui prend en charge l'expression rationnelle Perl:
(your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'