Bash 用网络替换可变 IP 地址

use*_*045 2 ip bash awk sed

我在一个变量中设置了一个 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
Run Code Online (Sandbox Code Playgroud)

如果最后一位数字发生变化,我需要一种方法来返回相同的网络值,即:

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"
Run Code Online (Sandbox Code Playgroud)

如何用上面的网络地址替换任何IP地址?

mau*_*uro 6

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

echo "${myip%.*}.0"
Run Code Online (Sandbox Code Playgroud)

例如:

$ echo "$myip"
192.168.1.22
$ echo "${myip%.*}.0"
192.168.1.0
Run Code Online (Sandbox Code Playgroud)


ani*_*ane 5

使用 sed

echo '192.168.1.2' | sed 's/\.[^.]*$/.0/'
sed 's/\.[^.]*$/.0/' <<< 192.168.1.22 # echo + pipe is not needed here
Run Code Online (Sandbox Code Playgroud)

逻辑:替换从最后.到最后的所有内容.0

使用 awk

awk -F. '{$NF=0}1' OFS=. <<< 192.168.1.22
awk '{$NF=0}1' FS=. OFS=. <<< 192.168.1.22
Run Code Online (Sandbox Code Playgroud)

逻辑:用 分割字符串.并将最后一个字段设置为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
Run Code Online (Sandbox Code Playgroud)

逻辑:在4个变量中读取IP地址的4个部分。打印第一个 3 和 a 0。或者通过使用 bash 数组,如果您不想用太多变量弄乱环境。