我真的不知道为什么,但 Amazon Web Services 为我的机器提供了一些奇怪的主机名。现在我需要用 Knife 列出所有主机名,以便在 Bash 脚本中使用。我说这些 IP 很奇怪,因为没有地方可以解析主机名,但这毕竟是没用的。
在我的脚本中,我只想从主机名中提取 IP。例如,从以下主机名中提取 10.114.152.134:
ip-10-114-152-134.valter.henrique.com
我怎样才能做到这一点?
答案1
这段代码肯定可以改进,但它应该可以完成工作:
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
答案2
这比 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 网络内访问。