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

Posted

技术标签:

【中文标题】需要将存储在 bash 变量中的 IP 地址分解为八位字节【英文标题】:need to break IP address stored in bash variable into octets 【发布时间】:2011-12-10 14:05:52 【问题描述】:

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

我需要像这样将该变量分成四个单独的八位字节:

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

这样我就可以逃脱 sed 中的句号。有一个更好的方法吗? awk 是我要找的吗?

【问题讨论】:

“在 sed 中转义句点”?为什么?将这些八位位组分开后,您想如何处理它们? Split string based on delimiter in bash? 的可能重复项 @Beta 我需要从用户输入参数中获取两个 IP 地址(例如 $1 和 $2),在文件列表(预生成)中搜索 $1,并将其替换为 $2。 我的 bash 已经很生锈了,但是 echo $ip | sed 's/\./\\\./g' 会为你摆脱这些点... 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

   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'...【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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


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

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

【讨论】:

【参考方案5】:

如果您想在不使用数组或带有换行符的单个变量的情况下将每个八位字节分配给自己的变量(这样您就可以轻松地通过 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 更多内容请参见this article。

【讨论】:

这会很好地工作。如果一个小时左右没有出现更清洁的东西,我会将你的答案标记为已接受的答案。谢谢!

以上是关于需要将存储在 bash 变量中的 IP 地址分解为八位字节的主要内容,如果未能解决你的问题,请参考以下文章

用基于该字符串的变量替换bash中的字符串[重复]

Bash 没有存储返回的 PHP 变量 [重复]

将IP地址放入bash变量。有没有更好的办法

将输出分配给Bash中的变量[重复]

bash中的数组

在 bash 脚本中进行 FTP 上传