Awk 模式匹配后如何更新或插入行

Awk 模式匹配后如何更新或插入行,awk,sed,Awk,Sed,我基本上需要一个awk或sed一个衬里来插入或编辑/替换gateway x.x.x.x到/etc/network/interfaces文件,用于特定的中频设备(它可以是em1或p2p1或p3p1)。我正在使用ubuntu linux 最好不要使用基于固定行号的正则表达式代码,比如在auto em1之后替换/插入第三行 请注意,参数可能会更改为auto p2p1或auto p3p1 场景1:em1的网关不存在,请插入新网关 auto lo iface lo inet loopback auto e

我基本上需要一个
awk
sed
一个衬里来插入或编辑/替换
gateway x.x.x.x
/etc/network/interfaces
文件,用于特定的中频设备(它可以是em1或p2p1或p3p1)。我正在使用ubuntu linux

最好不要使用基于固定行号的正则表达式代码,比如在
auto em1
之后替换/插入第三行

请注意,参数可能会更改为
auto p2p1
auto p3p1

场景1:em1的网关不存在,请插入新网关

auto lo
iface lo inet loopback
auto em1
iface em1 inet static
address 192.168.2.98
netmask 255.255.255.0
something random       <-- gateway x.x.x.x should be inserted before or after this for em1
auto p2p1
iface p2p1 inet static
address 192.168.2.121
netmask 255.255.255.0
gateway 192.168.2.1
auto p3p1
iface p3p1 inet static
address 192.168.2.121
netmask 255.255.255.0
gateway 192.168.2.1
auto-lo
iface lo inet环回
自动em1
iface em1 inet静态
地址192.168.2.98
网络掩码255.255.255.0

一些随机的使用
awk
,您应该有一个分离接口的定义良好的模式。在您的例子中,我假设它们都以“auto”开头,所以这个字符串将是要使用的模式。如果您需要一个不同的,取决于您的数据,下面的逻辑保持不变

awk -v i="em1" -v g="192.168.1.42" '
    f && /^auto/    {print "gateway "g; f=0}
    f && /^gateway/ {print "gateway "g; f=0; next}
    $0 ~ "auto "i   {f=1}
                    {print}
    END             {if (f) print "gateway "g}
' file
您可以看到不同之处在于
next
。更新时,我们调用
next
,并且没有到达此行的最后一个
print
操作(这是旧网关) 插入时,我们不调用它,所以我们打印行(这是新接口的开始)


添加了最后一个
END{}
语句,以在达到
EOF
且仍然
f=1
时打印网关行。这是为了解决我们编辑最后一个界面时,网关不存在的问题。

目标是您添加一些自己的代码,以显示您自己为解决此问题所做的研究工作。相信我,我已经尝试过了,这是最后的手段。无论如何,谢谢。@thekamilz,详细说明这个
应该只在一个具体的测试用例上为em1
操作编辑或替换这个。好吧,我想我已经说得很清楚了,如果em1是在一行中用say
auto em1
给出的,那么它应该如上所示。棒极了!非常感谢,我将使用此代码,如果您也能解决这一问题,我将非常感谢,否则我将使用此代码。问题是最后一个IF设备条目(本例中为p3p1)。如果此设备没有网关x.x.x.x,则此代码不起作用。我确实手动删除了最后一行,即网关192.168.2.1,并注意到了这一点。再次感谢。哦,是的,这很重要。因为在f=1时发现了EOF。我会更新答案。非常感谢。非常感谢。经过测试,工作正常。
awk -v i="em1" -v g="192.168.1.42" '
    f && /^auto/    {print "gateway "g; f=0}
    f && /^gateway/ {print "gateway "g; f=0; next}
    $0 ~ "auto "i   {f=1}
                    {print}
    END             {if (f) print "gateway "g}
' file