我正在尝试将特定网络设备的"dns-nameservers x.x“行添加到/etc/ ethX /interface(这是可以更改的,它可能是另一个文件中的另一个行)。
也就是说,要将dns-nameservers添加到em1中,我想使用如下命令:
sed -i '/^auto em1/,/^auto/ .....' /etc/network/interfaces目前:
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8我想要的是:
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers x.x.x.x (<- this line inserted)
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8提前谢谢。
发布于 2017-03-03 23:30:31
满足您当前和未来需求的解决方案是将与给定设备关联的每组行保存为单个记录,然后从函数打印它,例如:
$ awk '/^auto/{prtDev()} {dev = dev $0 ORS} END{prtDev()}
function prtDev() {printf "%s", dev; dev=""}' file
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8虽然这看起来只是按原样打印输入文件,但看看它是多么容易,然后只需调整函数,让它在第二个设备的末尾添加一行:
$ awk '/^auto/{prtDev()} {dev = dev $0 ORS} END{prtDev()}
function prtDev() {printf "%s", dev; if (cnt++ == 2) print "dns-nameservers x.x.x.x"; dev=""}' file
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
dns-nameservers x.x.x.x
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8或者只打印设备“em1”的记录:
$ awk '/^auto/{prtDev()} {dev = dev $0 ORS} END{prtDev()}
function prtDev() {if (dev ~ / em1 /) printf "%s", dev; dev=""}' file
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1或者匹配特定的网关IP地址,或者仅匹配环回,或者您可能想要选择或操作的任何其他内容,或者您想要打印的特定行,或者基于每个设备的任何其他内容。
发布于 2017-03-03 23:12:15
awk出手相救!
$ awk '/^auto em1/ {f=1}
/^auto eth1/ && f {print "NEW LINE GOES HERE"; f=0}1' file
auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
gateway 192.168.2.1
NEW LINE GOES HERE
auto eth1
iface eth1 inet static
address 192.168.3.155
netmask 255.255.255.0
dns-nameservers 8.8.8.8通过一个例子来澄清注释:匹配将在文件之间继续(如果找到超过一对开始/结束模式,则循环)。例如
$ awk '/^3/ {f=1}
/^6/ && f{print "HERE"; f=0}1' <(seq 5) <(seq 4 7)
1
2
3
4
5
4
5
HERE
6
7第一个输入文件没有结尾模式(即6),但搜索继续在第二个文件上进行。
如果这不是缩进行为,请澄清问题。
发布于 2017-03-03 23:44:15
这可能适用于您(GNU sed):
sed '/^auto em1/!b;:a;$bb;n;/^auto/!ba;:b;idns-nameservers x.x.x.x' file在遇到auto em1时,在此之后打印各行,并在启动auto的下一行之前插入所需的字符串。
https://stackoverflow.com/questions/42582066
复制相似问题