【问题标题】:Bash Replace Variable IP Address with NetworkBash 用网络替换可变 IP 地址
【发布时间】:2017-01-01 05:37:18
【问题描述】:

我在变量中设置了一个 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 地址?

【问题讨论】:

    标签: bash awk sed ip


    【解决方案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 地址不需要担心,但如果您要转换其中 许多 个 IP 地址,情况会有所不同.

    仅在bash 内执行此操作(不需要其他进程),您可以使用:

    pax> ip=12.34.56.78
    pax> echo ${ip%.[0-9]*}.0
    12.34.56.0
    

    【讨论】:

      【解决方案2】:

      使用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 个变量中读取 IP 地址的 4 个部分。打印前 3 个和一个 0。 或者通过使用 bash 数组,如果您不想使用太多变量使环境混乱。

      【讨论】:

      • 使用{ IFS=.; … }会改变运行shell的IFS,最好使用( IFS=.; read … )
      • @sorontar:我有想过,但在验证过程中出错了。我试过echo $IFS(显然返回空)而不是echo "$IFS"
      【解决方案3】:

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

      echo "${myip%.*}.0"
      

      例如:

      $ echo "$myip"
      192.168.1.22
      $ echo "${myip%.*}.0"
      192.168.1.0
      

      【讨论】:

        【解决方案4】:

        用纯 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)。

        如果这不是你将一直使用的,那么这个想法就会被打破。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-02-03
          • 2016-11-17
          • 1970-01-01
          • 1970-01-01
          • 2013-03-03
          • 2021-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多