sed: извлечь и вывести группу соответствия регулярному выражению

sed: извлечь и вывести группу соответствия регулярному выражению

Я пытаюсь извлечь IPv4-адрес сетевого интерфейса на Linux. У меня есть рабочее решение:

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

Для справки, вот пример вывода команды ip a show:

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

Хотя мое решение работает, мне интересно, есть лиsed путьчтобы захватить содержимое группы соответствия шаблону регулярного выражения и заменить текущую строку (в терминах sed,пространство шаблона) или как-то распечатать? Я считаю, что использовать s///pи расширять шаблон на всю линию (с .*началом и концом) — это лажа.

решение1

Разбор ipвывода, ориентированного на человека, — это ерунда. Используйте вывод JSON:

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

решение2

Вы можете удалить все, что вам не нужно, например: sed -n 's:.*inet ::; T; s:/.*::p'.

Однако другой подход заключается в использовании ip -o -f inetстандартных инструментов, например, trи cut:

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

Связанный контент