Linux 使用bash/sed/awk脚本重新排序网络路由文件的方法思考

Linux 使用bash/sed/awk脚本重新排序网络路由文件的方法思考,linux,bash,shell,awk,sed,Linux,Bash,Shell,Awk,Sed,重新构建框架,试图澄清问题 我有多个网络路由文件存在配置问题。在静态路由文件中,路由以3块为一组,并由附加到ADDRRES/NETMASK/GATEWAY的编号标识,在=: ADDRESS0=X.X.X.X NETMASK0=X.X.X.X GATEWAY0=X.X.X.X ADDRESS0=X.X.X.X is the network number for the static route. NETMASK0=X.X.X.X is the netmask for the network nu

重新构建框架,试图澄清问题

我有多个网络路由文件存在配置问题。在静态路由文件中,路由以3块为一组,并由附加到ADDRRES/NETMASK/GATEWAY的编号标识,在=:

ADDRESS0=X.X.X.X
NETMASK0=X.X.X.X
GATEWAY0=X.X.X.X

ADDRESS0=X.X.X.X is the network number for the static route.
NETMASK0=X.X.X.X is the netmask for the network number defined with ADDRESS0=X.X.X.X
GATEWAY0=X.X.X.X is the default gateway, or an IP address that can be used to reach ADDRESS0=X.X.X.X
然后,Linux将根据分配给每个组的编号添加路由

后续静态路由(地址#、网络掩码#、网关#部分)必须按顺序编号,并且不得跳过任何值。例如,ADDRESS0、NETMASK0、GATEWAY0、ADDRESS1、NETMASK1、GATEWAY1等等

例如,需要良好的配置,但主机可能有>20个条目:

ADDRESS0=xxxxxxxxxxxxxxx
NETMASK0=xxxxxxxxxxxxxxx
GATEWAY0=xxxxxxxxxxxxxxx
ADDRESS1=xxxxxxxxxxxxxxx
NETMASK1=xxxxxxxxxxxxxxx
GATEWAY1=xxxxxxxxxxxxxxx
ADDRESS2=xxxxxxxxxxxxxxx
NETMASK2=xxxxxxxxxxxxxxx
GATEWAY2=xxxxxxxxxxxxxxx
ADDRESS3=xxxxxxxxxxxxxxx
NETMASK3=xxxxxxxxxxxxxxx
GATEWAY3=xxxxxxxxxxxxxxx
ADDRESS4=xxxxxxxxxxxxxxx
NETMASK4=xxxxxxxxxxxxxxx
GATEWAY4=xxxxxxxxxxxxxxx
我的问题有两个方面

一:复制静态路由。在此配置中,它将遍历文件,为每个编号的文件添加路由 第0-2组。但是,由于有两个ADDRESS1/NETMASK1/GATEWAY1条目,其中一个条目将不会被添加

GATEWAY2=xxxxxxxxxxxxxxx
NETMASK2=xxxxxxxxxxxxxxx
ADDRESS2=xxxxxxxxxxxxxxx
GATEWAY1=xxxxxxxxxxxxxxx
NETMASK1=xxxxxxxxxxxxxxx
ADDRESS1=xxxxxxxxxxxxxxx
GATEWAY0=xxxxxxxxxxxxxxx
NETMASK0=xxxxxxxxxxxxxxx
ADDRESS0=xxxxxxxxxxxxxxx
ADDRESS1=xxxxxxxxxxxxxxx
NETMASK1=xxxxxxxxxxxxxxx
GATEWAY1=xxxxxxxxxxxxxxx
第二:它们不是按顺序排列的。在本例中,它将从编号为0-2的路由组进行迭代,但它将在那里停止,因为ADDRESS3/NETMASK3/GATEWAY3不存在。因此,它认为路由ADDRESS4和ADDRESS5不存在,因此没有添加

ADDRESS0=xxxxxxxxxxxxxxx
NETMASK0=xxxxxxxxxxxxxxx
GATEWAY0=xxxxxxxxxxxxxxx
ADDRESS1=xxxxxxxxxxxxxxx
NETMASK1=xxxxxxxxxxxxxxx
GATEWAY1=xxxxxxxxxxxxxxx
ADDRESS2=xxxxxxxxxxxxxxx
NETMASK2=xxxxxxxxxxxxxxx
GATEWAY2=xxxxxxxxxxxxxxx
ADDRESS4=xxxxxxxxxxxxxxx
NETMASK4=xxxxxxxxxxxxxxx
GATEWAY4=xxxxxxxxxxxxxxx
ADDRESS5=xxxxxxxxxxxxxxx
NETMASK5=xxxxxxxxxxxxxxx
GATEWAY5=xxxxxxxxxxxxxxx
我想删除/更改附加到ADDRESS/NETMASK/GATEWAY的数字并增加它们,但不更改值 由“=XXXXXXXXXXXXX”指定给他们的

例如,在例子2中,它将变成。因此,我正在寻找一种迭代文件的方法,更改ADDRESS/NETMASK/GATEWAY后面的数字并增加该数字:

ADDRESS0=xxxxxxxxxxxxxxx
NETMASK0=xxxxxxxxxxxxxxx
GATEWAY0=xxxxxxxxxxxxxxx
ADDRESS1=xxxxxxxxxxxxxxx
NETMASK1=xxxxxxxxxxxxxxx
GATEWAY1=xxxxxxxxxxxxxxx
ADDRESS2=xxxxxxxxxxxxxxx
NETMASK2=xxxxxxxxxxxxxxx
GATEWAY2=xxxxxxxxxxxxxxx
ADDRESS3=xxxxxxxxxxxxxxx
NETMASK3=xxxxxxxxxxxxxxx
GATEWAY3=xxxxxxxxxxxxxxx
ADDRESS4=xxxxxxxxxxxxxxx
NETMASK4=xxxxxxxxxxxxxxx
GATEWAY4=xxxxxxxxxxxxxxx

我在考虑对每个实例^ADDRESS的文件进行迭代,并将该数字从0更改/增加。并使用^NETMASK和^GATEWAY重复。但我没能找到一个实现它的方法。如果您需要进一步的澄清,请让我知道。非常感谢,下面的脚本大致满足您的需要

  • 通过输入中附加的id收集3元组
  • 将它们连续重新编号
  • 检查重复的ID
  • 检查“短元组”,其中三个元组中有一个缺失
(我添加了最后一项要求。):-)


注意:输出将连续排序,但规则的顺序不同。为了使它们保持有序,我可能一次收集并发出一个元组

因此,它们的键是唯一的数据,显示为
xxxxxxxxxxxxx
?您想为列表中的eack创建一个唯一的
xxxxxxxxxxxxx
,然后生成
address n
NETMASKn
GATEWAYn
“记录”?不,sed+awk组合从来都不是解决任何问题的正确答案,因为awk可以做任何事情,如果您已经在使用awk,那么您就不需要添加sed。你的问题非常不清楚。不要假设我们对您的域有任何了解-对我们来说,这些都只是行和列,因此您的问题和再次尝试描述您的问题时,请牢记这一点,并澄清您发布的“期望的最终状态”(期望的输出?)是否来自您提供的第一个或第二个示例输入文件。如果从2号开始,地址3等信息是从哪里来的?谢谢各位,我试着澄清一下。。。
#! /usr/bin/awk -f

BEGIN { FS = "=" }

/^ADDRESS|^NETMASK|^GATEWAY/ {
    id = substr($1, 8)
    sub(id "=", "%d=", $0)
    if( id in matched && 3 == split(matched[id], foo, "\n") ) {
        printf("error: %d already encountered", id) > "/dev/stderr"
        next
    }
    matched[id] = matched[id] $0 "\n"
}

END {
    for( id in matched ) {
        if( 3 != split(matched[id], foo, "\n") ) {
            printf("error: short set for %d: %s\n", id, matched[id]) > "/dev/stderr"
            next
        }
        printf(matched[id], i, i, i) 
        i++
    }
}