sed: extrae e imprime el grupo de coincidencias de expresiones regulares

sed: extrae e imprime el grupo de coincidencias de expresiones regulares

Estoy intentando extraer la dirección IPv4 de una interfaz de red en Linux. Tengo una solución que funciona:

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

Para que conste, aquí hay un ejemplo de resultado del ip a showcomando:

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

Si bien mi solución funciona, me pregunto si hay unacamino sedpara tomar el contenido del grupo de coincidencia de patrones de expresiones regulares y reemplazar la línea actual (en términos sed, elespacio de patrón) con él o imprimirlo de alguna manera? Considero que tener que usar s///py expandir el patrón a toda la línea ( .*al principio y al final) es una pifia.

Respuesta1

Analizar ipla producción orientada a los humanos es una chapuza. Utilice la salida JSON:

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

Respuesta2

Podrías eliminar todo lo que no quieras, por ejemplo: sed -n 's:.*inet ::; T; s:/.*::p'.

Sin embargo, otro enfoque es utilizar ip -o -f inetherramientas estándar, por ejemplo con try cut:

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

información relacionada