我有一个包含IP地址的bash变量(没有CIDR或任何东西,只有四个八位字节)。
我需要将这个变量分成四个独立的八位字节,如下所示:
$ip = 1.2.3.4;
$ip1 = 1
$ip2 = 2
# etc
所以我可以逃脱sed期间。有一个更好的方法吗?我正在寻找什么?
答案 0 :(得分:10)
你可以使用bash。这是一个单行,假设您的地址位于$ip
:
IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"
它的工作原理是仅为一个命令设置“内部字段分隔符”,将其从通常的空白分隔符更改为句点。 read
命令将尊重它。
答案 1 :(得分:5)
如果你想将每个八位字节分配给它自己的变量而不使用数组或带有换行符的单个变量(这样你就可以通过for循环轻松运行它),你可以使用#
和{{1修饰符%
如此:
${x}
请参阅此/wiki/Bash:_Append_to_array_using_while-loop
以及this article中的更多内容。
答案 2 :(得分:2)
您可以使用内置set
分割字符串,IFS
作为分隔符(通常为空格和制表符)。
splitip () {
local IFS
IFS=.
set -- $*
echo "$@"
}
splitip 12.34.56.78
# Now $1 contains 12, $2 contains 34, etc
如果你只需要反斜杠 - 转义点,请使用字符串替换 - bash有${ip//./\\.}
答案 3 :(得分:1)
当我想要做同样的事情时,我在另一个网站上找到了这个代码。适用于我的应用程序。
read ICINGAIPADDRESS
# The following lines will break the ICINGAIPADDRESS variable into the four octets
# and assign each octet to a variable.
ipoct1=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $1 }')
ipoct2=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $2 }')
ipoct3=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $3 }')
ipoct4=$(echo ${ICINGAIPADDRESS} | tr "." " " | awk '{ print $4 }')
答案 4 :(得分:0)
更简单的方法是使用AWK:
echo 192.168.0.12 | awk -F. '{print $1 $2 $3 $4}'
-F是字段分隔符,在这种情况下,我们使用点“。”作为分隔符并分别打印每列。
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $1 $2 $3 $4}'
76220156100
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $1}'
76
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $2}'
220
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $3}'
156
mortiz@florida:~/Documents/projects$ echo 76.220.156.100 | awk -F. '{print $4}'
100