Вытягивание 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.

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 
  • В чем разница между `-C` и` -c` в команде `tr`?
  • Говоря «tr», что az - это не только ASCII
  • Удалять пробелы между двумя словами ТОЛЬКО
  • Как превратить буквы с прописными буквами в верхний регистр? - Используя команду 'tr'
  • Измените все, кроме первого «,» на «» для каждой строки в файле (bash)
  • tr не заменяет апостроф
  • Есть ли библиотека или инструмент для «перевода» строки с одного раскладки клавиатуры на другой?
  • Как использовать команду tr для замены: полные остановки, восклицания и вопросительные знаки, за которыми следует пробел, с символами новой строки?
  • Как преобразовать файлы txt UTF-8 во все прописные буквы в bash?
  • Разделить аналогичные строки
  • Debian wheezy update break tr команда
  • Linux и Unix - лучшая ОС в мире.