在启动时使用sed / awk写入/ etc / networking / interfaces吗?

Col*_*lin 0 bash ubuntu awk sed

新手在这里,

我正在尝试/etc/network/interfaces在引导时使用(当前)写入新配置的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
自动搜索
iface lo inet回送

使用sed,我尝试更改第一行和第二行,添加第三行,删除网关,最后两行,最后添加四行。

我目前停留在添加第三行,因为脚本每次运行时都会添加此行:

#!/ 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为实现这一目标而去寻找?

Jan*_*lho 5

您可以使用sed来做到这一点:

sed -i -e '4{/iface eth0 inet static/! i\
    iface eth0 inet static
    }'
Run Code Online (Sandbox Code Playgroud)

您可以使用大括号对命令进行分组。花括号中的命令仅在第三行执行。在iINSERT命令将只执行第三行如果第三行没有斜杠之间的字符串(匹配!它告诉它来执行时,它不匹配后)。

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

sed -i -e '3{/gateway/d}'
Run Code Online (Sandbox Code Playgroud)

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

sed -i -e '/gateway/d'
Run Code Online (Sandbox Code Playgroud)

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

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

sed -i -e '${/auto lo/d;/iface lo inet loopback/d}'
sed -i -e '${/auto lo/d;/iface lo inet loopback/d}'
Run Code Online (Sandbox Code Playgroud)

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

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

sed -i -e '$a\
newline1\
newline2\
newline3'
Run Code Online (Sandbox Code Playgroud)

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

sed -i -e '${/192\.168\.1\.1/!a\
newline1\
newline2\
newline3
}'
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助=)