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?
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
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)
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.
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}
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
$
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"
grep -oE "\b([0-9]{1,3}\.?){4}\b"
vielleicht das, ein Sed-Befehl, nur für Sport:
ip -o -4 addr show dev eth0 | sed 's/.* inet \([^/]*\).*/\1/'
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
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/'
Wenn Sie grep verwenden, das Perl regex unterstützt:
(your command that pulls mentioned line) | grep -Po 'inet \K[\d\.]+'