sed: Regexp-Übereinstimmungsgruppe extrahieren und drucken

sed: Regexp-Übereinstimmungsgruppe extrahieren und drucken

Ich versuche, die IPv4-Adresse einer Netzwerkschnittstelle unter Linux zu extrahieren. Ich habe eine funktionierende Lösung:

IFACE=eth0
ip a show dev $IFACE | sed -n 's/.*inet \(.*\)\/.*/\1/p'

Zur Veranschaulichung folgt hier eine Beispielausgabe des ip a showBefehls:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:51:51:b4:a9:08 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.20/24 brd 10.0.2.255 scope global ens192
       valid_lft forever preferred_lft forever
    inet6 fe80::251:56ff:fec1:4915/64 scope link 
       valid_lft forever preferred_lft forever

Obwohl meine Lösung funktioniert, frage ich mich, ob es einesed Wegum den Inhalt der Regex-Musterübereinstimmungsgruppe zu erfassen und die aktuelle Zeile zu ersetzen (in sed-Begriffen, dieMusterraum) damit oder irgendwie ausdrucken? s///pDas Muster auf die ganze Zeile (mit .*am Anfang und Ende) anwenden und erweitern zu müssen, halte ich für einen Kludge.

Antwort1

Das Parsen von ipbenutzerorientierter Ausgabe ist ein Provisorium. Verwenden Sie die JSON-Ausgabe:

ip -4 -json a show dev $IFACE scope global | jq -r ".[].addr_info[].local"

Antwort2

Sie können alles entfernen, was Sie nicht möchten, z. B.: sed -n 's:.*inet ::; T; s:/.*::p'.

Ein anderer Ansatz besteht jedoch darin, ip -o -f inetStandardwerkzeuge zu verwenden, beispielsweise mit trund cut:

ip -o -f inet addr show dev eth0 | tr -s ' ' '/' | cut -d/ -f4

verwandte Informationen