gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:22:53 26 4
gpt4 key购买 nike

重新构建框架以尝试澄清问题......

我有多个网络路由文件存在配置问题。在静态路由文件中,路由按 3 个 block 分组,并通过附加到 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 将根据分配给每个组的编号添加路由。

后续静态路由(ADDRESS#、NETMASK#、GATEWAY# 部分)必须按顺序编号,并且不得跳过任何值。例如,ADDRESS0,NETMASK0,GATEWAY0 、THEN、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

我的问题有两个...

ONE:重复的静态路由。在此配置中,它将迭代文件,为每个编号添加路由组 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

我想删除/更改附加到地址/网络掩码/网关的数字并增加它们,但不更改值分配给由“=xxxxxxxxxxxxxxx”指定的它们

例如,在示例二中,它会变成。因此,我正在寻找一种方法来迭代文件,更改附加到 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
  • 检查“短元组”,其中三个缺少之一

(我添加了最后一个要求。):-)

#! /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++
}
}

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

关于linux - 关于使用 bash/sed/awk 脚本重新排序网络路由文件的方法的思考,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38487073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com