Извлечь 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 one liner + как соответствовать IP-адресу, который находится в поле файла first / sec
  • Чтобы удалить новые строки после пустой строки
  • конвертировать в эпоху и обратно
  • Выход MOZREPL, отображающийся в окне терминала
  • Замена совпадающего текста после двух совпадающих строк
  • Как заменить только N-е вхождение шаблона в файл?
  • Переупорядочить несколько линейных блоков с помощью Sed
  • Как подсчитать количество вхождений числа, большего чем x, из каждого столбца?
  • 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 - лучшая ОС в мире.