Возвращение вывода из Perl Regex

Попробуйте с этим:

awk  '$7!=""' file > final_output
1
25.07.2016, 04:47
2 ответа

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

может быть более подходящим.

2
27.01.2020, 23:25

Фактически, регулярное выражение

([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 содержит то, что соответствует первому () .)

{ {1}}
1
27.01.2020, 23:25

Теги

Похожие вопросы