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

Regex 需要将bash变量中存储的IP地址拆分为八位字节,regex,bash,variables,sed,ip-address,Regex,Bash,Variables,Sed,Ip Address,我有一个bash变量,它包含一个IP地址(没有CIDR或任何东西,只有四个八位字节) 我需要把这个变量分成四个独立的八位字节,如下所示: $ip = 1.2.3.4; $ip1 = 1 $ip2 = 2 # etc 这样我就可以避开sed中的周期。有更好的方法吗?awk是我要找的吗?如果您想将每个八位字节分配给自己的变量,而不使用数组或带有换行符的单个变量(这样您就可以轻松地通过for循环运行它),您可以使用和%修饰符来${x},如下所示: [20:08]jon@MacBookPro~]$x

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

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

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

这样我就可以避开sed中的周期。有更好的方法吗?awk是我要找的吗?

如果您想将每个八位字节分配给自己的变量,而不使用数组或带有换行符的单个变量(这样您就可以轻松地通过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
看到这个了吗

以及更多信息。

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


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

您可以使用bash。这里有一行代码,假设您的地址位于
$ip

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

IFS=。阅读IP1IP2IP3IP4这段代码是我在另一个网站上发现的,当时我正打算做同样的事情。非常适合我的应用程序

   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是字段分隔符,在本例中,我们使用点“.”作为分隔符,并单独打印每列


“逃离sed中的周期”?为什么?一旦你把这些八位字节分开,你想用它们做什么?可能是@Beta的重复我需要从用户输入参数中获取两个IP地址(例如$1和$2),搜索一个文件列表(预生成)中出现的$1,然后用$2替换它。我的bash已经生锈了,但是
echo$ip | sed's/\./\\\\./g'
将为您避开这些点…这将很好地工作。。如果在一个小时左右没有更干净的东西出现,我会把你的答案记为接受答案。谢谢对于完整的
awk
解决方案,您可以完全跳过
tr
,并将
设置为输入分隔符:
awk-F.{print$1}'
。。。
echo 192.168.0.12 | awk -F. '{print $1 $2 $3 $4}'
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