抱歉-我现在已经编辑了标题-最初的标题与我想要的相反。
我想包含模式的第一行,以及直到出现结束模式的每一行。结束模式是开始模式的子集,因此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'