用于更改IP并保存新文件的shell脚本

时间:2012-04-17 05:40:37

标签: perl bash sed awk

我有一个包含不同IP地址的文本文件。我需要编写一个脚本来查找带有IP的行(还有其他行)并将最后一位数增加1.这应该完成50次!

这意味着将保存50个新文件。我不想使用逻辑转到行号并替换特定字符。

文件名也存在于文件中,应再次增加1。我正在使用sed,但无法实现正确的循环和选项。

输入文件是example1:

 'name example101' 
'ip-address  10.255.255.13'
state enabled 
 'ip-address 10.255.253.45' 
'ip-address 10.255.255.13' 
'ip-address 10.0.0.130'

第一个新文件是example102(最后一个是example150):

 'name example102' 
'ip-address  10.255.255.14'
state enabled 
 'ip-address 10.255.253.46' 
'ip-address 10.255.255.14' 
'ip-address 10.0.0.131'

4 个答案:

答案 0 :(得分:2)

要增加IP,您可以使用此正则表达式:

perl -lpe 's/((\d{1,3}\.){3})(\d{1,3})/$1 . ($3 + 1)/eg' FILE

要增加'name example101',您可以尝试类似的表达式。

答案 1 :(得分:0)

使用?!

忽略特定的IP
perl -lpe 's/((ip-address\s+(?!10\.255\.253\.45)((\d{1,3}\.){3}))(\d{1,3}))/$2.($5 + 1)/eg;s/(example)(\d{3})/$1.($2 + 1)/eg;' FILE

(?!10\.255\.253\.45)部分

中添加ip以忽略

UPDATE:添加了部分s/(example)(\d{3})/$1.($2 + 1)/eg;以增加输入字符串example101,使其成为example102。

答案 2 :(得分:0)

我可以在Vim中以交互方式在几秒钟内完成此操作。在Vim中,Ctrl-A增加光标下的数字。搜索IP地址,转到最后一个八位字节,递增。在注册a下的键盘宏中录制,调用@a,然后按住@@再重复N次。

以下是确切的按键:

开始录制:

qa

搜索下一个IPv4地址的开头:

 /\([0-9]\+\.\)\{3\}[0-9]\+[Enter]

在最后一个八位位组前跳转到点(前进3点到点):

 3f.

增量:

 Ctrl-A

完成录制:

 q

现在,再次运行宏:

 @a

重复(按住@键进行自动重复):

 @@

如果您注意到您编辑了一个IP,那么您不应该只使用u根据需要多次撤消,请跳过它,然后从那里开始。

答案 3 :(得分:0)

此命令行程序会增加除IP地址10.0.0.130以外的所有数字(包括文件编号)。如果要忽略多个或两个地址,则此方法将变得难以处理,您应该执行诸如将所有不可变地址放在文件或程序的__DATA__部分中的操作。

perl -pe "s/(\d+)('\s*)$/($1+1).$2/e unless /\b\Q10.0.0.130\E\b/" ipfile

<强>输出

 'name example102'
'ip-address  10.255.255.14'
state enabled
 'ip-address 10.255.253.46'
'ip-address 10.255.255.14'
'ip-address 10.0.0.130'

修改

要向修改添加第二个排除项,此命令还会保护0.0.0.0

perl -pe "s/(\d+)('\s*)$/($1+1).$2/e unless /\b\Q10.0.0.130\E|\Q0.0.0.0\E\b/" ipfile