Bash用网络替换可变IP地址
我在一个变量中设置了一个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
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。