Bash用网络替换可变IP地址

Bash用网络替换可变IP地址,bash,awk,sed,ip,Bash,Awk,Sed,Ip,我在一个变量中设置了一个IP地址,我想将其转换为网络地址 这仅适用于单个数字: echo '192.168.1.2' | sed 's/.$/0/' => 192.168.1.0 echo '192.168.1.22' | sed 's/.$/0/' => 192.168.1.20 echo '192.168.1.223' | sed 's/.$/0/' => 192.168.1.220 如果最后一位数字发生变化,我需要一种方法返回相同的网络值,即: myip="192

我在一个变量中设置了一个IP地址,我想将其转换为网络地址

这仅适用于单个数字:

echo '192.168.1.2' | sed 's/.$/0/'  => 192.168.1.0
echo '192.168.1.22' | sed 's/.$/0/'  => 192.168.1.20
echo '192.168.1.223' | sed 's/.$/0/'  => 192.168.1.220
如果最后一位数字发生变化,我需要一种方法返回相同的网络值,即:

myip="192.168.1.2"   => "192.168.1.0"
myip="192.168.1.22"  => "192.168.1.0"
myip="192.168.1.223" => "192.168.1.0"
如何用上面的网络地址替换任何IP地址?

使用sed

逻辑:使用拆分字符串。并将最后一个字段设置为0

纯bash:

myip="192.168.1.2  ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.22 ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.223";  echo "$myip ==> ${myip%.*}.0"
逻辑:在4个变量中读取IP地址的4部分。打印第一个3和一个0。 或者,如果您不想让环境中的变量太多,可以使用bash数组。

使用sed

逻辑:使用拆分字符串。并将最后一个字段设置为0

纯bash:

myip="192.168.1.2  ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.22 ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.223";  echo "$myip ==> ${myip%.*}.0"
逻辑:在4个变量中读取IP地址的4部分。打印第一个3和一个0。 或者,如果您不想让环境中的变量过多,可以使用bash数组。

您可以通过以下方式使用awk实现这一点:

然而,所有这些都会导致启动一个额外的进程,对于一些IP地址,这并不是你需要担心的,但是如果你转换了很多IP地址,这将产生不同

要在bash中完成此操作而不需要另一个进程,您可以使用:

pax> ip=12.34.56.78
pax> echo ${ip%.[0-9]*}.0
12.34.56.0
您可以使用awk执行此操作,方法是:

然而,所有这些都会导致启动一个额外的进程,对于一些IP地址,这并不是你需要担心的,但是如果你转换了很多IP地址,这将产生不同

要在bash中完成此操作而不需要另一个进程,您可以使用:

pax> ip=12.34.56.78
pax> echo ${ip%.[0-9]*}.0
12.34.56.0

没有外部命令的纯bash解决方案:

echo "${myip%.*}.0"
例如:

$ echo "$myip"
192.168.1.22
$ echo "${myip%.*}.0"
192.168.1.0

没有外部命令的纯bash解决方案:

echo "${myip%.*}.0"
例如:

$ echo "$myip"
192.168.1.22
$ echo "${myip%.*}.0"
192.168.1.0

使用纯bash非常简单:

myip="192.168.1.2  ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.22 ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.223";  echo "$myip ==> ${myip%.*}.0"
结果:

192.168.1.2   ==> 192.168.1.0
192.168.1.22  ==> 192.168.1.0
192.168.1.223 ==> 192.168.1.0
然而,这是假设网络的CDIR为24192.168.1.2/24


如果这不是您经常使用的,那么这个想法将被打破。

使用纯bash非常简单:

myip="192.168.1.2  ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.22 ";  echo "$myip ==> ${myip%.*}.0"
myip="192.168.1.223";  echo "$myip ==> ${myip%.*}.0"
结果:

192.168.1.2   ==> 192.168.1.0
192.168.1.22  ==> 192.168.1.0
192.168.1.223 ==> 192.168.1.0
然而,这是假设网络的CDIR为24192.168.1.2/24


如果这不是您经常使用的,那么这个想法将被打破。

使用{IFS=。;…}将更改运行shell的IFS,最好使用IFS=。;读…@sorontar:我已经想到了,但在验证过程中犯了一个错误。我尝试了echo$IFS,它返回的显然是空的,而不是echo$IFS。;读…@sorontar:我已经想到了,但在验证过程中犯了一个错误。我尝试了echo$IFS,它显然返回空的,而不是echo$IFS。