0

新手来了

我正在尝试/etc/network/interfaces在启动时使用 (current) 写入新配置的 XEN Ubuntu (12.04/10.04/8.04) DomU 服务器的自动生成文件sed

自动生成的文件格式如下:

自动 eth0
iface eth0 inet 静态
    地址 192.168.0.88
    网关 192.168.0.254
    网络 255.255.255.255
自动lo
iface lo inet 环回

使用sed,我正在尝试更改第 1 行和第 2 行,添加第三行,删除网关和最后两行,并在最后附加四行。

我目前坚持添加第三行,因为脚本每次运行时都会添加这一行:

#!/bin/bash

sed -i "1s/.*/auto lo eth0/" /tmp/interfaces
sed -i "2s/.*/iface lo inet loopback/" /tmp/interfaces
sed -i "2a\iface eth0 inet static" /tmp/interfaces
sed -i "s/auto lo//g" /tmp/interfaces

sed是否可以仅在使用(或)不存在的情况下添加第三行awk

同样,如果网关和最后两行不存在,我怎样才能删除它们?

我是新手sed,所以想知道我是否应该考虑awk实现这一目标?

4

2 回答 2

5

你可以用 sed 做到这一点:

sed -i -e '4{/iface eth0 inet static/! i\
    iface eth0 inet static
    }'

您可以使用大括号对命令进行分组。大括号中的命令只会在第三行执行。i插入命令只会在第三行执行,并且如果第三行不匹配斜线之间的字符串(!after 它告诉它在不匹配时执行)。

您可以执行相同的删除操作:

sed -i -e '3{/gateway/d}'

这里我们只删除包含字符串的第三行gateway。您可能会更通用,只需执行以下操作:

sed -i -e '/gateway/d'

这将删除所有包含网关的行,但这可能不是您想要的。

至于删除最后几行,最简单的解决方案是:

sed -i -e '${/auto lo/d;/iface lo inet loopback/d}'
sed -i -e '${/auto lo/d;/iface lo inet loopback/d}'

如果d删除命令与auto lo或匹配,则在最后一行执行删除命令iface lo inet loopback。如果它们与模式匹配,则执行两次将删除最后两行。

如果要在文件末尾添加行,可以执行以下操作:

sed -i -e '$a\
newline1\
newline2\
newline3'

或者仅在最后一行不是特定行时才添加它们:

sed -i -e '${/192\.168\.1\.1/!a\
newline1\
newline2\
newline3
}'

希望这会有所帮助=)

于 2012-10-09T11:51:23.257 回答
1

这个脚本可以完成这项工作:https ://github.com/JoeKuan/Network-Interfaces-Script

awk -f changeInterface.awk <interfaces file> <device=ethX> 
 <mode=(dhcp|static|manual)> [action=add|remove] 
 [address=<ip addr> netmask=<ip addr> <name=value> ...]
于 2017-02-08T11:25:53.650 回答