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

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,]; } 
  • Выполните команду в 'sed'
  • При знаке после shebang?
  • Как разбить файл на несколько файлов на основе шаблона с помощью perl?
  • Заменить новый символ линии между двумя строками
  • Регулярное выражение для каждого слова, содержащего & с $ ... $
  • Вырезать определенную часть столбца из файла csv
  • Как заменить только N-е вхождение шаблона в файл?
  • найти две последовательные повторяющиеся строки
  • Используйте awk / sed, чтобы удалить все, кроме шаблона соответствия в определенном столбце
  • Печать нескольких строк после n-го появления в bash
  • Почему Perl установлен по умолчанию в большинстве дистрибутивов Linux?
  • Interesting Posts

    Пакеты дополнительных пакетов Virtualbox?

    Обнаружение раскладки клавиатуры, набрав клавиши на archlinux

    Выключить и перезапустить контрольный код?

    Настройка VLAN через командную строку работает, ifcfg-ethX.Y не делает (CentOS 6.8)

    Как установить общий сетевой предел для каждого клиента + приоритет для подтверждений TCP

    Устранение уставок Xmonad по умолчанию: какова конфигурация будущих доказательств?

    Правило tun0 + iptables

    Как изменить код ключа с помощью setkeycodes

    Можно ли удалить Windows 7 с двойной загрузки?

    Как найти репозиторий yum

    Я просто использовал «mv» вместо «cp» для важных файлов. Как этого избежать в будущем?

    Не удалось создать дамп ядра apache2

    Почему у меня нет обновлений пакетов в Fedora?

    ls -lu не дает последнего времени доступа

    Чтение значений массива в качестве пользовательского ввода дает неправильную длину массива и только -a или -p работает при чтении

    Linux и Unix - лучшая ОС в мире.