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

6

我有一个包含IP地址的Bash变量(没有CIDR或其他任何内容,只有四个八位组)。

我需要将该变量分解为四个独立的八位组,如下所示:

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

我想在sed中转义句点,有更好的方法吗?awk是否适合我的需求?


如何在sed中转义句点?为什么要这样做?一旦你将它们分开,你想用这些八位字节做什么? - Beta
@Beta 我需要从用户输入参数(例如 $1 和 $2)中获取两个 IP 地址,然后在文件列表(预先生成的)中搜索 $1 的出现,并将其替换为 $2。 - brent saner
1
我的bash已经很生疏了,但是echo $ip | sed 's/\./\\\./g'可以为您转义点... - Beta
5个回答

18

你可以使用bash。这里是一个一行代码,假设你的地址在$ip中:

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

这个命令通过设置“内部字段分隔符”来运行,仅对一个命令进行更改,将其从通常的空格分隔符更改为句点。 read 命令会使用它。


7

如果您想将每个八位字节分配给自己的变量而不使用数组或单个具有换行符的变量(以便您可以轻松地通过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了解更多信息
同时,这篇文章也有更多内容.


这个方案不错..如果一个小时内没有更好的解决方案出现,我会将您的答案标记为接受的答案。谢谢! - brent saner

2

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

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

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

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


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

对于完整的awk解决方案,您可以完全跳过tr并将.设置为输入分隔符:awk -F. '{print $1}'... - aff

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接