我在变量中设置了一个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地址?
答案 0 :(得分:4)
使用sed
echo '192.168.1.2' | sed 's/\.[^.]*$/.0/'
sed 's/\.[^.]*$/.0/' <<< 192.168.1.22 # echo + pipe is not needed here
逻辑:使用.
.0
到结尾的所有内容
使用awk
awk -F. '{$NF=0}1' OFS=. <<< 192.168.1.22
awk '{$NF=0}1' FS=. OFS=. <<< 192.168.1.22
逻辑:使用.
拆分字符串,并将最后一个字段设置为0
。
纯bash
:
{ IFS=. read a b c _; echo $a.$b.$c.0; } <<< 192.168.1.22
( IFS=.; read -a ip; ip[3]=0; echo "${ip[*]}"; ) <<< 192.168.1.22
逻辑:在4个变量中读取4个IP地址。打印前3和0
。
或者通过使用bash数组,如果你不想让环境变得太多变化。
答案 1 :(得分:4)
没有外部命令的纯粹bash解决方案:
echo "${myip%.*}.0"
例如:
$ echo "$myip"
192.168.1.22
$ echo "${myip%.*}.0"
192.168.1.0
答案 2 :(得分:1)
您可以使用以下代码awk
执行此操作:
pax> awk -F. '{print $1"."$2"."$3".0"}' <<<12.34.56.78
12.34.56.0
使用sed
,可以直接替换最后的所有数字:
pax sed 's/[0-9]*$/0/' <<<12.34.56.78
12.34.56.0
但是,所有这些都会导致额外的进程启动,而不是您需要为几个IP地址担心,但如果您要转换很多,它们会有所不同
仅在bash
内进行(不需要其他流程),您可以使用:
pax> ip=12.34.56.78
pax> echo ${ip%.[0-9]*}.0
12.34.56.0
答案 3 :(得分: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为24(192.168.1.2/24)。
如果这不是你将永远使用的,那么这个想法就会破裂。