0

抱歉-我现在编辑了标题-标题最初与我想要的相反。

我想包括模式的第一行,以及直到出现结束模式的每一行。结束模式是开始模式的子集,因此 sed 的行为与 AWK 不同。

这样做的目的是构建一个枚举 Cisco ASA 网络类型对象组的 ba​​sh 函数。

此外,如果输出行中的任何行包含“group-object”,则还需要枚举该组对象。我确信通过一些循环,if's 和 awk's 和或 sed's 这可以做到。

例如

object-group network OBJECT-GROUP-DADDY
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP
 network-object 10.3.1.0 255.255.255.0
object-group network ANY-OTHER-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
 network-object 10.11.1.0 255.255.255.0
 network-object 10.22.1.0 255.255.255.0

将返回:

object-group network OBJECT-GROUP-DADDY
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP --+ EXPANDED BELOW
 ----network-object 10.11.1.0 255.255.255.0
 ----network-object 10.22.1.0 255.255.255.0

目前 - 我什至无法让第一部分工作(没有枚举嵌套组)另外 - 嵌套组,可能有嵌套组!啊啊啊

sed -n '/object-group network OBJECT-GROUP-DADDY/,/object-group network/p' ASA_CONFIG.cfg

给了我我需要的东西,但确实包括了 END 模式的第一行,它是我不关心的对象组的开始。

awk 版本似乎没有返回任何内容,我猜是因为结束模式是开始模式的子字符串:

awk '/object-group network OBJECT-GROUP-DADDY/,/object-group network/p' ASA_CONFIG.cfg

有一个使用 next 和 flags 的指南,但我无法从一堆不同的站点中获得它的头部或尾部。

好的,这是添加的信息:

在回答你的问题时,我不知道awk语言,也不知道sed。我是一名网络工程师——我想对于那些不涉足该学科的人来说,我为什么要实现这一点对你们来说是个谜。我的编程很糟糕,而且我的 linux 很弱。

cisco ASA 配置中的访问控制列表通常使用如下访问列表构建:

访问列表 ACCESS-LIST 扩展许可 ip 对象组 SOURCE-OBJECT-GROUP 对象组 DESTINATION-OBJECT-GROUP

大写的任何内容都已由人类在某个时间点输入,小写单词由 cisco 保留,用于解析等。“对象组”就像编程语言中的数组。这些访问列表也可能包含不止一行,或者明确定义了网络,而不是使用对象组。

我想为指定访问列表中的源对象组和目标对象组枚举所有对象组条目。这些对象组的格式如下

object-group network DESTINATION-OBJECT-GROUP
 network-object 10.33.1.0 255.255.255.0
 network-object 10.44.1.0 255.255.255.0
object-group network ANY-OTHER-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
object-group network SOURCE-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP
 network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
 network-object 10.11.1.0 255.255.255.0
 network-object 10.22.1.0 255.255.255.0

在上面的示例中,使用前面介绍的访问控制列表,我想要源对象组输出:

object-group network SOURCE-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
group-object NESTED-OBJECT-GROUP
 network-object 10.3.1.0 255.255.255.0

但是请注意,这个名为 SOURCE-OBJECT-GROUP 的对象组还包含一个组对象,这是一个保留字,意思是 - 这是一个嵌套对象组,需要从配置中的其他位置读取。

所以输出需要是:

object-group network SOURCE-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP
 ---enumerated----network-object 10.3.1.0 255.255.255.0
 network-object 10.3.1.0 255.255.255.0

我们不希望来自不属于访问列表一部分或未嵌套在顶级访问列表中的其他对象组的任何输出。此概念类似于 Active Directory 中的嵌套组。

我现在尝试给你一些伪代码:

AWK 使用 awk print $6 和 awk print $9 打印访问列表中的对象组名称/变量

访问列表 ACCESS-LIST 扩展许可 ip 对象组 SOURCE-OBJECT-GROUP 对象组 DESTINATION-OBJECT-GROUP

将这些中的每一个存储为一些变量,然后枚举。像 $source-object-group-name, $destination-object-group-name

函数 enumerate-object-group 输入 $source-object-group-name

因此,如果 $source-object-group-name = "SOURCE-OBJECT-GROUP" 进行某种不匹配“SOURCE-OBJECT-GROUP1”的显式模式匹配,(某种 grep -w 样式的东西)打印下面的每一行. 这是因为许多对象组的名称比其他对象组长。例如,像 run 是 running 的子字符串

(1) 打印“标题行”object-group network SOURCE-OBJECT-GROUP

(2)检查行是否以“group-object”开头(注意这是一个反转的保留名称,因此 cisco 可以区分)---> YES?将此“对象组”的值发送到另一个函数,就像这个函数一样。可以使用 awk print $2 获取此值

---> 没有?打印该行,因为它只是一个“正常”行,因为它不以“group-object”开头

 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0

---> 是吗?将此“对象组”的值发送到另一个函数,就像这个函数一样。这个值可以用 awk print $2 (goto 1?)

(3) 继续配置,直到我们遇到一些以“object-group network”开头的文本,但不包含原始组对象的显式名称,这意味着 - 它是一个我们不包含的新对象组关心,因为它不是我们从访问列表中提取的,也不是嵌套的,我们正在扩展。

将 $destination-object-group-name 泵入函数 repeat 访问列表中的所有行

我知道这很复杂,并且这里有两个级别(或更多)的嵌套组。如果您需要更多信息,请告诉我。

我无法正确显示评论,正在尝试使用双空格换行。

我试过你的建议,用 {$d;p} 替换 end sed p 但是,我得到相同的输出:

[nickc@localhost ~]$ sed -n '/object-group network SOURCE-OBJECT-GROUP/,/object-group network/{$d;p}' ASA_CONFIG.cfg
object-group network SOURCE-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP
 network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
[nickc@localhost ~]$ sed -n '/object-group network SOURCE-OBJECT-GROUP/,/object-group network/p' ASA_CONFIG.cfg
object-group network SOURCE-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP
 network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP

我们需要确保省略最后一行。我使用以下文本进行测试:

nickc@localhost ~]$ cat ASA_CONFIG.cfg
object-group network DESTINATION-OBJECT-GROUP
 network-object 10.33.1.0 255.255.255.0
 network-object 10.44.1.0 255.255.255.0
object-group network ANY-OTHER-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
object-group network SOURCE-OBJECT-GROUP
 network-object 10.1.1.0 255.255.255.0
 network-object 10.2.1.0 255.255.255.0
 group-object NESTED-OBJECT-GROUP
 network-object 10.3.1.0 255.255.255.0
object-group network NESTED-OBJECT-GROUP
 network-object 10.11.1.0 255.255.255.0
 network-object 10.22.1.0 255.255.255.0
4

1 回答 1

1

sed -n '/object-group network OBJECT-GROUP-DADDY/,/object-group network/{$d;p}' ASA_CONFIG.cfg

$d 将删除模式的最后一行。

更新:据我所知,上述解决方案应该可以工作但由于某种原因(可能是 sed 错误) - 以下是一种解决方法:

sed -n '/object-group network OBJECT-GROUP-DADDY/,/object-group network/p' ASA_CONFIG.cfg | sed '$d'

于 2014-11-06T10:45:44.513 回答