Вытягивание IP-адреса из команды ping с помощью sed?

Я создал инструмент Bash, который работает на сервере. Этот инструмент блокирует определенные IP-адреса для определенного временного диапазона (т. Е. С 5:00 до 15:30).

На данный момент инструмент работает отлично, но я должен вводить IP-адреса на определенные сайты вручную в текстовый файл и иметь инструмент для вытягивания IP-адреса на основе n-й строки с помощью команд «head» и «tail». Я не хочу этого делать, поскольку я считаю, что один пинг будет намного более легким и портативным. Поэтому, если я сделаю ping для Google:

ping google.com -c 1 -s 16 

Выход будет:

 Ubuntu@yokai:~# ping google.com -c 1 -s 16 PING google.com (173.194.66.138) 16(44) bytes of data. 24 bytes from qo-in-f138.1e100.net (173.194.66.138): icmp_seq=1 ttl=37 time=46.7 ms --- google.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 46.748/46.748/46.748/0.000 ms 

И команда, которую я сузил этот вывод, есть:

 ping google.com -c 1 -s 16 | grep -o '([^ ]*' | tr -d '(44):\n' 

Это дает мне результат:

 173.19.66.113173.19.66.113ubuntu@yokai 

Как вы можете видеть, есть дубликат того же IP-адреса. Как удалить дубликат с помощью sed, чтобы я мог сохранить единственный IP-адрес в переменной и запустить скрипт как cronjob, или я лучше нахожусь на треке с помощью tr?

(РЕДАКТИРОВАТЬ)

Я уже знаю / знал, как разрешать IP-адрес от имени хоста или домена. Это не то, о чем я прошу здесь. Этот вопрос касается управления выводами ping с помощью sed, чтобы сохранить инструмент, который я создал, более портативный, поскольку ping по умолчанию используется практически всеми и всеми дистрибутивами linux.

  • Как отображать каждый день месяца в отдельной строке с помощью tr, sed и cal
  • Чтобы удалить новые строки после пустой строки
  • Heirloom Toolchest tr: ошибка (ы), пытающаяся удалить дополнение к набору, содержащему многобайтовый символ?
  • Как я могу распечатать все, кроме последних n символов в bash?
  • Как подавить предупреждающее сообщение?
  • tr -c '' '\ n' не заменяет всех символов дополнения
  • Могу ли я использовать `sed` для перевода символов, например, с помощью` tr`?
  • Почему tr не читается с / dev / urandom на OSX?
  • 3 Solutions collect form web for “Вытягивание IP-адреса из команды ping с помощью sed?”

    ping предназначен для проверки того, находится ли хост вверх или вниз на основе ответа ICMP, он никогда не является правильным инструментом только для разрешения IP-адреса, для этого есть специальные инструменты.

    Вы должны посмотреть на dig , host , nslookup – все, что вам понравится.

    Вот dig :

     % dig +short google.com 123.108.243.57 123.108.243.51 123.108.243.54 123.108.243.48 123.108.243.60 123.108.243.52 123.108.243.56 123.108.243.55 123.108.243.61 123.108.243.58 123.108.243.49 123.108.243.50 123.108.243.59 123.108.243.47 123.108.243.53 

    В качестве примечания в Linux, если вы хотите запросить NSSwitch (Name Service Switch), то есть /etc/nsswitch , используйте команду getent с ahosts данных hosts (или ahosts ), например:

     getent hosts google.com 

    На моем компьютере у меня есть:

     hosts: files mdns4 dns 

    в /etc/nsswitch.conf , поэтому getent hosts будут последовательно запрашивать и использовать gethostbyaddr(3) или gethostbyname(3) на основе имени, а ahosts будут использовать getaddrinfo(3) .

    По сути, с моей конфигурацией, это сначала проверит /etc/hosts , затем mDNS и, наконец, DNS.


    Если вы настаиваете на использовании ping и sed , вы можете сделать:

     % ping -c1 google.com | sed -nE 's/^PING[^(]+\(([^)]+)\).*/\1/p' 123.108.243.56 

    Просмотр Google Я нашел ссылку на другую запись unix.SE, в которой упоминается getent – я даже не знал, что эта программа существует.

    Вы можете использовать getent как dig для разрешения IP для имени хоста – и моя система была установлена ​​по умолчанию, но не getent . Если вы хотите хосты ipv6, измените ahostsv4 на ahostsv6 .

     getent ahostsv4 google.com | awk '{print $1}' | head -1 

    Я добавил этот ответ, потому что я плохо в regexes / sed и не смог бы найти ответ @ heemayl.

    Следует отметить, что, как вы видите в выводе digger @ heemayl, некоторые сайты могут иметь более одного IP-адреса. Вероятно, вам понадобится DNS-поиск, чтобы получить их все, поскольку ping будет использовать только первый адрес, который он получит. То же самое для чего-то еще, что в основном хочет подключиться, а не специально перечислять адреса.

    (Кроме того, в случае чего-то вроде google, вы будете получать разные IP-адреса в зависимости от того, на каком основании вы находитесь. Может быть, здесь не проблема, но хорошо заметить.)

    Другое дело, о команде, которую вы использовали. Это: tr -d '(44):\n' удаляет все копии символов ( , 4 , ) : и \n из ввода. tr всегда смотрит только на одиночные символы, а не на строки. Глядя на результат, который вы получили, вы увидите, что 4 пропал без вести с середины IP-адреса. Используйте другой инструмент, например sed для работы со строками.

    Просто для того, чтобы показать разные цвета для сарая для велосипедов , вот еще один простой, с GNU grep:

     $ ping google.com -c1 | head -1 | grep -Eo '[0-9.]{4,}' 172.217.22.174 
    Linux и Unix - лучшая ОС в мире.