it-swarm.com.de

Extrahieren der IP-Adresse aus einer Zeile aus der Ausgabe von ifconfig mit grep

In Anbetracht dieser bestimmten Zeile aus ifconfig, in meinem Fall:

inet 192.168.2.13 netmask 0xffffff00 broadcast 192.168.2.255

Wie könnte man den 192.168.2.13-Teil (die lokale IP-Adresse) extrahieren, vermutlich mit Regex?

24
JJJollyjim

Hier ist eine Möglichkeit, grep zu verwenden:

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"

Ergebnisse:

192.168.2.13
192.168.2.256

Wenn Sie nur gültige Adressen auswählen möchten, können Sie Folgendes verwenden:

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"

Ergebnisse:

192.168.0.255

Ansonsten wählen Sie einfach die gewünschten Felder mit awk aus, zum Beispiel:

line='inet 192.168.0.255 netmask 0xffffff00 broadcast 192.168.2.256'

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

Ergebnisse:

192.168.0.255
192.168.2.256


Nachtrag:

Wortgrenzen : \b

55
Steve

verwenden Sie diese Regex ((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

du kannst egrep verwenden (was im Grunde das gleiche wie grep -E ist)
In egrep gibt es benannte Gruppen für Zeichenklassen, z. B. "digit".
(was den Befehl in diesem Fall länger macht - aber Sie bekommen den Punkt ...)

gut zu wissen ist, dass Sie mit Klammern bis Wiederholung ein Muster verwenden können

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

oder 

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


wenn Sie sich nur für die tatsächliche IP-Adresse interessieren, verwenden Sie den Parameter -o, um die Ausgabe auf abgestimmtes Muster anstelle der gesamten Zeile zu beschränken:

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

... und wenn Sie keine BCast-Adressen haben möchten, können Sie diesen grep verwenden:

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

Ich nahm an, Sie sprachen nur über IPv4-Adressen.

3
Jens Bayer

Um nur einen alternativen Weg hinzuzufügen:

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

es werden alle IP-Adressen außer der localhost-Adresse ausgedruckt.

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

2
Stefan

Ich habe nicht genug Reputationspunkte, um einen Kommentar abzugeben, aber ich habe einen Fehler in Steve's regulärer "Nur gültige Adressen auswählen" gefunden. Ich verstehe das Problem nicht ganz, aber ich glaube, ich habe das Problem gefunden. Der erste Befehl zeigt den Fehler. Der zweite demonstriert den Fix:

$ 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

Dieser Code funktioniert auch gut und einfach.

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

vielleicht das, ein Sed-Befehl, nur für Sport:

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

Dieser Code funktioniert für mich auf Raspberry Pi zero w.

(extrahiere wlan0: inet 192.168.x.yaddress von ifconfig ausgabe)

Suchen Sie nach dem Muster 'inet 192' in der Ausgabe von ifconfig und erhalten Sie die 10. Position mit space als Trennzeichen. 

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

Ausgabe: 192.168.1.6

0
T.I.Adrian

Eine Möglichkeit, sed zu verwenden. Der erste Befehl löscht alle Zeichen bis zur ersten Ziffer in der Zeile und der zweite Befehl speichert die erste IP in Gruppe 1 (\1) und ersetzt alle Zeilen damit:

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

Wenn Sie grep verwenden, das Perl regex unterstützt:

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