繁体   English   中英

需要将存储在bash变量中的IP地址分解为八位字节

[英]need to break IP address stored in bash variable into octets

我有一个包含IP地址的bash变量(没有CIDR或任何东西,只有四个八位字节)。

我需要将这个变量分成四个独立的八位字节,如下所示:

$ip = 1.2.3.4; 
$ip1 = 1
$ip2 = 2
# etc

所以我可以逃脱sed期间。 有一个更好的方法吗? 是awk我在找什么?

你可以使用bash。 这是一个假设您的地址在$ip的单行:

IFS=. read ip1 ip2 ip3 ip4 <<< "$ip"

它的工作原理是仅为一个命令设置“内部字段分隔符”,将其从通常的空白分隔符更改为句点。 read命令将尊重它。

如果你想将每个八位字节分配给它自己的变量而不使用数组或带有换行符的单个变量(这样你可以通过for循环轻松运行它),你可以使用#%修饰符来${x}如下所示:

[ 20:08 jon@MacBookPro ~ ]$ x=192.160.1.1 && echo $x
192.160.1.1
[ 20:08 jon@MacBookPro ~ ]$ oc1=${x%%.*} && echo $o1
192
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
160.1.1
[ 20:08 jon@MacBookPro ~ ]$ oc2={x%%.*} && echo $o2
160
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
1.1
[ 20:08 jon@MacBookPro ~ ]$ oc3=${x%%.*} && echo $o3
1
[ 20:08 jon@MacBookPro ~ ]$ x=${x#*.*} && echo $x
1
[ 20:08 jon@MacBookPro ~ ]$ oc4=${x%%.*} && echo $oc4
1

[ 20:09 jon@MacBookPro ~ ]$ echo "$oc1\.$oc2\.$oc3\.$oc4"
192\.160\.1\.1

看到/ wiki / Bash:_Append_to_array_using_while-loop
以及本文中的更多内容

您可以使用内置set拆分字符串, IFS作为分隔符(通常为空格和制表符)。

splitip () {
    local IFS
    IFS=.
    set -- $*
    echo "$@"
}

splitip 12.34.56.78
# Now $1 contains 12, $2 contains 34, etc

如果你只需要反斜杠 - 转义点,使用字符串替换 - bash有${ip//./\\\\.}

当我想要做同样的事情时,我在另一个网站上找到了这个代码。 适用于我的应用程序。

   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 }')

更简单的方法是使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM