Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Проблема с регуляркой (Perl) (http://forum.oszone.net/showthread.php?t=343853)

Armsinglom 29-01-2020 09:16 2907457

Проблема с регуляркой (Perl)
 
Добрый день.
Есть скрипт на Perl'e, которым я собираю инфу с машины. Столкнулся с проблемой при разборе файла /etc/hosts, а именно с регуляркой которая будет выцеплять нужный мне IP.
Файл hosts примерно выглядит так:
Код:

10.10.10.101    msk-pc-101-rv1.dome.name    msk-rv-101-rv1
10.10.10.102    msk-pc-102-rbc1.dome.name    msk-rbc-102-rv1
10.10.10.103    msk-pc-103-rp1.dome.name    msk-rp1-103-rv1
10.10.10.104    msk-pc-104-rv1.dome.name    msk-rv1-104-rv1

Меня интересуют IP который имеет часть имени bc1, оно иногда может быть BC1, DCBC1, dcbc1. Вообщем суть такая что нужно выгребать IP в строке где есть bc[0-9] или BC[0-9].
Побывал с начало egrep

Вот часть скрипта которая не работает:
Код:

unless(`cat /etc/hosts` =~ m/ (10\.[0-9]+\.[0-9]+\.[0-9]+)\[ +]\[a-zA-Z0-9]+\-\[a-zA-Z]+\-\[bc1]/) {
  console( COLOR => 'red', MESSAGE => 'Ошибка получения IP BC' ); die; }
my $bc1 = $1;

Побывал сначало egrep делать, что бы оставалась только одна строка, запихивал её в unless, но при попытке вырвать IP все равно давал ошибку...

Есть идеи что можно сделать?

P.S. регулятора которая в данный момент в скрипте 100 раз видоизмененная, может показаться полным бредом :).

DJ Mogarych 29-01-2020 10:19 2907460

Код:

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=.*bc\d)

Sham 29-01-2020 10:22 2907461

https://regex101.com/r/4mLUCx/2 (флаг g для наглядности). Подмасок нет, будет $&.

Armsinglom 29-01-2020 13:54 2907484

Да спасибо, обе регулярки отрабатывают корректно.
Но эта часть скрипта почему то, не отрабатывает.
Вот в этом же скрипте, данная часть отрабатывает корректно:
Код:

unless(`ifconfig` =~ m/inet (10\.[0-9]+\.[0-9]+\.[0-9]+)/) {
  console( COLOR => 'red', MESSAGE => 'Ошибка получения IP адреса' ); }
my $ip_addr = $1;

А вот с этим беда:
Код:

unless (`cat /etc/hosts` =~ m/ ^10\.\d+\.\d+\.\d+(?=\h+\V+?bс[0-9]+)/) {
  console( COLOR => 'red', MESSAGE => 'Ошибка получения IP БС' );}
my $bog1 = $1;

что может быть не так?

Armsinglom 29-01-2020 14:44 2907488

При таком варианте возвращает пустату, но ошибки нет
Код:

unless (`cat /etc/hosts` =~ m/ \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=.*bc\d)/) {
  console( COLOR => 'red', MESSAGE => 'Ошибка получения IP БС' );}
my $bog1 = $1;


Sham 29-01-2020 15:13 2907491

https://rextester.com/UOWM34553 Один IP нужен или все?

Armsinglom 29-01-2020 15:33 2907494

Вообщем один, а как он себя будет вести если вдруг 2 найдет?

Sham 29-01-2020 16:20 2907502

для мультипоиска нужен массив и флаг g

Armsinglom 29-01-2020 22:28 2907548

я не знаю почему, но заработало только после того как я добавил в:
Код:

'cat /etc/hosts | egrep '?bc[0-9]+|?BC[0-9]+'
И моя и ваши регулярки стали прекрасно вытягивать IP.

DJ Mogarych 30-01-2020 09:42 2907594

Можно, наверное, даже так:
Код:

egrep '?bc[0-9]+|?BC[0-9]+' /etc/hosts


Время: 16:33.

Время: 16:33.
© OSzone.net 2001-