Bash用网络替换可变IP地址

时间:2017-01-01 05:37:18

标签: 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.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地址?

4 个答案:

答案 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)。

如果这不是你将永远使用的,那么这个想法就会破裂。

相关问题