Я действительно не знаю почему, но Amazon Web Services предоставили мне некоторые странные имена хостов для моих машин. Теперь мне нужно перечислить их все с помощью ножа для использования в скрипте bash. Я говорю, что IP-адреса странные, потому что ни в одном месте вы не можете определить имя хоста, что, впрочем, бесполезно.

В моем сценарии я хотел бы извлечь только IP из имени хоста. Например, извлеките 10.114.152.134 из следующего имени хоста:

ip-10-114-152-134.valter.henrique.com

Как я могу это сделать?

2 ответа2

3

Этот фрагмент, безусловно, может быть улучшен, но он должен выполнять свою работу:

hostname=ip-10-114-152-134.valter.henrique.com
hostip=$(echo ${hostname%%.*} | sed -e 's/ip-//' -e 's/-/./g')

${hostname%%.*} удаляет все после (и в том числе) первого . ; Затем sed удаляет начальный ip- и заменяет затем тире точками.


Вы также можете использовать только одну команду sed :

echo ip-10-114-152-134.valter.henrique.com | sed 's/ip-\(.*\)-\(.*\)-\(.*\)-\(.*\)\.valter\.henrique\.com/\1.\2.\3.\4/'

Регулярное выражение в первых скобках (вам нужно избегать этих: \(.*\) ) Присваивается \1 и так далее.


Вот последний вариант, использующий только функции bash:

IFSsave="$IFS"; IFS=-                            # save IFS prior modifying it
hostip=""
hostname=ip-10-114-152-134.valter.henrique.com   # initial values
hostname=${hostname#*-}                          # remove the "ip-" part
hostname=${hostname%%.*}                         # remove the ".valter.henrique.com" part
for i in $hostname; do                           # loop over 10-114-152-134, splitted at "-" ($IFS)
   hostip="${hostip}${i}."                       # append number. to $hostip
done
hostip=${hostip%.}                               # remove trailing dot
echo $hostip                                     # print resulting IP
IFS="$IFSsave"                                   # restore IFS
3

Это менее надежно, чем вариант mpy только для Bash, поскольку предполагает, что часть IP-адреса всегда находится в одном и том же положении, но она немного короче и немного быстрее.

hostname=ip-10-114-152-134.valter.henrique.com
IFSsave=$IFS
IFS=.-
parts=($hostname)
hostip="${parts[*]:1:4}"
IFS=$IFSsave
echo "$hostip"

Использование * в качестве индекса массива внутри кавычек приводит к вставке первого символа IFS между каждым элементом массива. Установка IFS на два символа вызывает разделение на любом из них.

Кстати, это доменное имя для меня выглядит так:

$ host ip-10-114-152-134.valter.henrique.com
ip-10-114-152-134.valter.henrique.com has address 208.91.197.27

Адрес 10.114.152.134 является частным IP-адресом, который не маршрутизируется через Интернет. Возможно, он доступен только в сети AWS.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .