Извлечь 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; } 

  • Perl для сравнения двух последовательных строк для первого символа и игнорирования второй строки, если оба первых символа одинаковы
  • linux / solaris + проверить дублирующий действительный IP-адрес из файла
  • Использование регулярного выражения для проверки того, работает ли процесс UNIX
  • ksh + удалить номер из строки
  • Код Perl для ссылки на несколько файлов одного и того же расширения (.xml)
  • Совместить данные из двух разных файлов
  • Могу ли я использовать команду find для передачи аргументов perl?
  • Легкий способ разбора формата даты syslog
  • 4 Solutions collect form web for “Извлечь IP-адрес из строки”

    Поскольку вы разместили это на сайте 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,]; } 
    Linux и Unix - лучшая ОС в мире.