извлечение регулярного выражения perl ip из выходных данных маршрутизатора - PullRequest
1 голос
/ 04 апреля 2011

У меня вывод этой команды маршрутизатора:

Interface              IP-Address      OK? Method Status                Protocol
POS0/0/0               10.137.99.2    YES NVRAM  up                    up    

Я хочу найти регулярное выражение для определения IP-адреса:

Я пытался:

if ( $_ =~ m/(.*?)\s*?(.*?)\s*?(.*?)\s*?(.*)/i ){
    #print "$1->$2\n";
    $sources{$2}=$1;
}

и затем используйте $2 в качестве ip.

Однако, это не работает;где я не прав?

Ответы [ 5 ]

6 голосов
/ 04 апреля 2011
if ($_ =~ /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/)
{
        print "IP: $1\n";
}

Если вы просто хотите получить второй столбец, возможно, вам следует использовать split вместо регулярных выражений.Для получения поля № 2:

@field = split(/ +/, $_);
print "$field[1]";
2 голосов
/ 04 апреля 2011

Поскольку это регулярно форматируемые данные, вы, вероятно, можете просто использовать split: и получить это следующим образом:

#!/usr/bin/env perl
use Modern::Perl;


my $buff = "Interface              IP-Address      OK? Method Status                Protocol
POS0/0/0               10.137.99.2    YES NVRAM  up                    up  ";

for my $line (split /\n/,$buff)
{
  next if $line =~ /^Interface/;
  my ($interface, $ip) = (split /\s+/,$line)[0,1];
  say "IP $ip is on Interface $interface";
}

, который производит этот вывод:

IP 10.137.99.2 is on Interface POS0/0/0
2 голосов
/ 04 апреля 2011

Ответ PacoRG работает хорошо, но, чтобы объяснить, где у вас что-то не так:

Помните, что * может соответствовать без вхождений .Вы говорите каждой группе, чтобы они соответствовали как можно меньшему количеству, поэтому первые 3 группы ничего не захватывают.Кроме того, вы хотите получить как можно больше много последовательных пробельных символов, а не так мало.

Для RegEx, чем-то похожего на оригинал, вы можете использовать

m/(.+?)\s+(.+?)\s+(.+?)\s+(.+?)/i
1 голос
/ 04 апреля 2011

Ошибка - все эти минимальные совпадения.Просто используйте

($if, $ip) = split;
$sources{$ip} = $if;
0 голосов
/ 04 апреля 2011

Попробуйте с:

m/.*?(\d+\.\d+\.\d+\.\d+).*/i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...