一个提取 ip 地址的衬里,最后一个八位字节替换为 0

one liner to extract ip address with last octet replaced with 0

我有基于 Beaglebone Black 的定制板,
我想提取接口 eth0 的 ip 地址并将第四个八位字节替换为 0.
我正在使用下面的一个衬垫来提取 ip,

ip addr show eth0 | awk  '=="inet"{print }'
output : 192.168.2.158/24

Expected output : 192.168.2.0/24

但是我无法使第四个八位字节为 0,我想过使用函数 gsub 但是无法获得正确的组合。 :(

我不想在命令中使用更多管道。

有 suggestion/pointers 吗?

还有其他建议吗?

基于预期输出:替换第四个八位字节。

ip addr show eth0  |awk '/inet / {split(,a,".");split(,b,"/");print a[1] "." a[2] "." a[3] ".0/" b[2]}'
142.133.152.0/25

如果是第三个八位字节:

ip addr show eth0  |awk '/inet / {split(,a,".");print a[1] "." a[2] ".0." a[4] }'
142.133.0.192/25

你还好吗?

ip addr show eth0 | awk  '=="inet" {gsub(".[0-9]*/24",".0/24",);print }'

您可以将地址的最后一个八位字节和斜杠替换为 0/:

ip addr show eth0 | awk '=="inet"{sub(/[0-9]+\//, "0/", ); print }'

sed

$ ip addr show eth0 | sed -nE '/^\s*inet\b/ s/^\s*inet\s*(([0-9]+\.){3})[0-9]+(\S+).*//p'
192.168.1.0/24
  • /^\s*inet\b/ 只过滤需要的行
  • s/^\s*inet\s*(([0-9]+\.){3})[0-9]+(\S+).*// 捕获数字序列后跟 . 三次,省略下一个数字序列,然后捕获非 space 字符。按要求替换
  • 某些版本可能适用于 sed -nr 而不是 sed -nE