Войти

Показать полную графическую версию : Проблема с регуляркой (Perl)


Armsinglom
29-01-2020, 09:16
Добрый день.
Есть скрипт на 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
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(?=.*bc\d)

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

Armsinglom
29-01-2020, 13:54
Да спасибо, обе регулярки отрабатывают корректно.
Но эта часть скрипта почему то, не отрабатывает.
Вот в этом же скрипте, данная часть отрабатывает корректно:

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
При таком варианте возвращает пустату, но ошибки нет
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
https://rextester.com/UOWM34553 Один IP нужен или все?

Armsinglom
29-01-2020, 15:33
Вообщем один, а как он себя будет вести если вдруг 2 найдет?

Sham
29-01-2020, 16:20
для мультипоиска нужен массив и флаг g

Armsinglom
29-01-2020, 22:28
я не знаю почему, но заработало только после того как я добавил в:
'cat /etc/hosts | egrep '?bc[0-9]+|?BC[0-9]+'

И моя и ваши регулярки стали прекрасно вытягивать IP.

DJ Mogarych
30-01-2020, 09:42
Можно, наверное, даже так:

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




© OSzone.net 2001-2012