不包括awk和sed中模式匹配的最后一行,但包括第一行



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

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

这样做的目的是建立一个bash函数来枚举网络类型的Cisco ASA对象组。

更进一步,如果输出行中的任何一行包含"group-object" -那么也需要枚举该组对象。我确信使用一些循环,if和awk和/或sed可以做到这一点。

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的指南,但是我不能从一堆不同的网站上弄清楚它的头或尾。

OK这里是添加的信息:

回答你的问题,不,我不懂awk语言,也不懂。我是一名网络工程师,我想对于那些不涉猎这一学科的人来说,我为什么想要实现这个目标对你们来说是个谜。我不擅长编程,我的linux系统也很弱。

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

access-list access-list extended permit ip object-group SOURCE-OBJECT-GROUP 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的对象组还包含一个group-object,这是一个保留字,意思是-这是一个嵌套的对象组,需要从配置中的其他地方读入。

所以输出需要是:

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

我们不希望从不属于访问列表的其他对象组中输出任何输出,或者不嵌套在顶级访问列表中。这个概念类似于活动目录中的嵌套组。

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

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

access-list access-list extended permit ip object-group SOURCE-OBJECT-GROUP object-group DESTINATION-OBJECT-GROUP

将每个变量存储为某个变量,然后枚举。如$source-object-group-name, $destination-object-group-name

function enumerate-object-group input $source-object-group-name

所以如果$ SOURCE-OBJECT-GROUP -name = "SOURCE-OBJECT-GROUP"做一些显式的模式匹配,不匹配"SOURCE-OBJECT-GROUP1",(一些grep -w风格的东西)打印下面的每一行。这是因为许多对象组只是命名时间比其他对象组长。例如run是running

的子字符串(1)打印"title line"SOURCE-OBJECT-GROUP

(2)检查行是否以"group-object"开头(注意这是一个反向保留名,以便cisco可以区分)——>是的?将这个"object-group"的值发送给另一个函数,就像这个函数一样。这个值可以通过awk print $2

获取-> NO ?打印该行,因为它只是一个"正常"的行,因为它不是以"group-object"开头的

network-object 10.1.1.0 255.255.255.0
network-object 10.2.1.0 255.255.255.0

>,是吗?将这个"object-group"的值发送给另一个函数,就像这个函数一样。这个值可以通过awk print $2 (goto 1?)

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

将$destination-object-group-name注入函数对访问列表

中的所有行重复此操作我知道这很复杂,这里有两层(或更多)嵌套组。如果你需要更多的信息,请告诉我。

我无法正确显示注释,正在尝试用双空格换行

我尝试了你的建议,将结尾的sed p替换为{$d;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

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'

相关内容

最新更新