grep
может быть здесь не лучшим вариантом, хотя с включенным PCRE grep
и -o
можно получить IP-адреса с поиском назад нулевой ширины, чтобы найти inet
, а затем сопоставить следующий IP-адрес.
ip addr | grep -Po '(?<=inet )[^/]+'
Для многострочной задачи «получить inet-адрес подключенных устройств», что-то вроде
ip link | awk -F: '/state UP/{print $2}' \
| while read updev; do \
ip addr show $updev | grep -Po '(?<=inet )[^/]+'; done
может быть более подходящим.
Фактически, регулярное выражение
([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}
, которое вы впервые представили, работает , с соответствующей средой, и Perl:
$ perl -l -0 -ne 'print $& if /([0-9]+:.{1,}state UP.{1,}(\n.{1,}?){1,}inet )\K([0-9]{1,3}\.?){4}/' < output_of_your_ip_addr
192.168.1.100
-0
читает файл полностью (вместо построчно строка), а $ &
содержит совпадающую часть (то, что осталось после \ K
, отбрасывает левую часть).
Хотя, если Perl можно использовать, я бы просто написал
ip addr | perl -l -0ne 'print $1 while /state UP.*?inet ([0-9.]+)/sg'
, чтобы вывести все совпадения. (Измените , а
на , если
принимает только первое совпадение. $ 1
содержит то, что соответствует первому ()
.)