使用bash脚本更改子网

时间:2012-10-29 14:45:48

标签: bash sed awk

我希望将文件中192.168.XXX的每个实例更改为192.168.yyy。在使用bash脚本的网络配置文件中。让我感到高兴的是,我不确定xxx将会是什么。例如,它可以是192.168.122.1或192.168.123.1。它也可能是192.168.122.2或192.168.122等。我想这可以用一个命令完成。

以下是默认网络文件:

    <network>
      <name>default</name>
      <bridge name="virbr0" />
      <forward/>
      <ip address="192.168.122.1" netmask="255.255.255.0">
        <dhcp>
          <range start="192.168.122.2" end="192.168.122.254" />
        </dhcp>
      </ip>
    </network>

2 个答案:

答案 0 :(得分:0)

以下sed一个班轮将更改IP 的第3部分(在此示例中为15)并保持其他2或3部分不变。

sed -r 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g'

输出:

192.168.0.12
192.168.15.12

192.168.25.34
192.168.15.34

192.168.0
192.168.15

所以要在192.168.XXX.YYY运行

中将所有IP从192.168.15.YYY更改为192.168.XXX192.168.YYY更改为network.conf

sed -r 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g' network.conf

这将显示带有更改的stdout文件,如果您对更改感到满意,请使用-i选项将更改保存到文件中。

sed -r -i 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g' network.conf

请记住将192.168.15.\1更改为192.168.XXX.\1,其中XXX是您需要的实际数字(不是15)并更改文件名(来自network.conf)。

答案 1 :(得分:0)

sed命令

NEWIP=YYY
sed "s/192\.168\.[0-9]*/192.168.$NEWIP/g" filename

(用一些数字代替YYY)会将192.168.XXX更改为192.168.YYY,这样做也会将表格192.168.XXX.ZZZ更改为192.168.YYY.ZZZ。 g中的s/.../.../g表示要更改一行上的所有匹配,而不是仅更改第一行。如图所示,它将在stdout上输出结果。如果要编辑文件,请使用-i开关:

sed -i "s/192\.168\.[0-9]*/192.168.$NEWIP/g" filename

如果您想在使用扩展程序〜备份原始文件后编辑文件,可以说:

sed -i~ "s/192\.168\.[0-9]*/192.168.$NEWIP/g" filename

注意,更改表格192.168.122的条目(即有三个部分而不是四个部分的条目)按要求进行;然而,这样的改变并不一定有意义。如LarsH's answerWhy does pinging 192.168.072 (only 2 dots) return a response from 192.168.0.58?所述,IP点缀格式A.B.C等同于A.B.0.C,如果遵循该约定,则更改192.168.122(使用值192.168.0.122)表示192.168.15(值192.168.0.15)。