Извлечь 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-скриптом
  • Я хочу найти дубликаты в файле и добавить символ в конец строки в первом совпадении
  • Сопоставьте начало линии с чем-то там?
  • Как я могу установить все отсутствующие библиотеки perl?
  • squid access.log удалить записи старше 6 месяцев
  • Ack regex на имена файлов
  • Индекс увеличения в файле
  • 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,]; } 
    Interesting Posts

    Как запустить программу, которая имеет собственную командную строку в программе сценария оболочки

    Найти команду – список аргументов слишком длинный

    Как использовать rsync или scp для эффективной копирования файлов с machineB и machineC в machineA?

    hunspell: добавить слово в словарь из командной строки

    Как получить записи таблицы psql в сценарии оболочки?

    владелец и группа по умолчанию для symlink и chown pass-through

    Установите гостевые дополнения виртуального окна Debian wheezy

    Проверка наличия программного обеспечения в сеансе SSH

    как рассказать vi, чтобы не открывать всех включенных юдеров?

    xinput – Ctrl + <Left> неправильно, если сопоставление истории-поиска-назад

    Как изменить размер LVM-диска в Debian 8.6 без потери данных

    Файлы в $ ZSH_CUSTOM, не загруженные oh-my-zsh

    Как сообщить GNOME, чтобы перечитать мой файл ~ / .profile

    Извлечение чисел с плавающей точкой из имени файла

    понимание безопасного запуска скрипта как ограниченного пользователя

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