Извлечь IP-адрес из строки

Команда host Linux возвращает:

 hostA.domain.com has address xx.xxx.xxx.xx 

Как получить только IP-адрес и поместить его в переменную $ipaddr ?

 open(FILE, "hostlist.txt") or die("Unable to open file"); @hostnames = <FILE>; close(FILE); foreach $hostname (@hostnames) { $lookup = qx(host $hostname); $ipaddr = grep ip_address $lookup; <---- need help here print $ipaddr; } 

Поскольку вы разместили это на сайте Unix & Linux, вместо StackOverflow, мне интересно, не похоже ли на то, что вы ищете:

 cat hostlist.txt | xargs resolveip -s 

Это приведет только к возврату одного IP-адреса.

Некоторые имена хостов будут иметь несколько связанных с ними IP-адресов:

 $ host www.google.com www.google.com is an alias for www.l.google.com. www.l.google.com has address 74.125.227.18 www.l.google.com has address 74.125.227.17 www.l.google.com has address 74.125.227.16 www.l.google.com has address 74.125.227.20 www.l.google.com has address 74.125.227.19 

Чтобы получить только список IP-адресов, один из способов сделать это:

 host <hostname> | grep "has address" | awk '{print $4}' 

Если вы хотите придерживаться Perl, с помощью resolip:

 $ipaddr = qx(resolveip -s $hostname); 

Или получить все IP-адреса, не выполняя никаких команд оболочки:

 use Socket; @ipaddrs = map { inet_ntoa($_) } (gethostbyname($hostname))[4,]; 

Почему бы просто не использовать dig +short ?

Я бы использовал что-то вроде:

 (\d{1,3}\.){3}\d{1,3} 

Если вы хотите что-то более требовательное, то вы, вероятно, будете иметь:

 ([012]?\d{1,2}\.){3}[012]?\d{1,2} 

Но даже это все еще несколько ослаблено. Например, он по-прежнему допускает ложное совпадение «269.278.287.296».

Но оба соответствуют стандарту от 0.0.0 до 255.255.255.255.

Чтобы добавить к ответу @mkopala, если у вас несколько хостов, и вы хотите отслеживать их, создайте хеш, чтобы была простая ссылка на сопоставление хоста с ip.

Пример:

 #!/usr/bin/perl use Socket; @hostnames = ('www.google.com', 'www.yahoo.com', 'www.facebook.com'); %ipaddrs = (); foreach $hostname (@hostnames) { map { $ipaddrs{$hostname} = inet_ntoa($_) } (gethostbyname($hostname))[4,]; }