Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

为解析非结构化输出的 Junos PyEZ 操作表定义视图

用于非结构化输出的 Junos PyEZ 操作 (op) 表从在 Junos 设备上执行的 CLI 命令或在给定灵活 PIC 集中器 (FPC) 上执行的 vty 命令的文本输出中提取数据。表与视图相关联, 视图用于访问表项中的字段并将它们映射到用户定义的 Python 变量。通过在 Table 定义中包含 view 该属性,将 Table 与特定视图相关联,该属性将 View 名称作为其参数。

视图将用户定义的变量映射到所选表项中的数据。视图使您能够将输出中的特定字段作为变量访问,这些变量具有可在 Python 中操作的属性。Junos PyEZ 负责处理将数据提取到 Python 中,以及任何类型转换或数据规范化。视图中定义的键必须是有效的 Python 变量名称。

本主题讨论视图的不同组件。

用于解析非结构化输出的视图中的参数摘要

Junos PyEZ 视图与表一样,使用 YAML 进行格式化。分析非结构化输出的视图可以包含许多参数。 表 1 总结了参数。

表 1:用于非结构化输出的 Junos PyEZ Op 表视图中的参数

视图参数

描述

视图名称

视图的用户定义标识符。

columns

(选答)命令输出中的列标题列表。

eval

(选答)一个或多个键值对的关联数组或字典,用于将用户定义的键映射到包含数学表达式的字符串。为数据的每次迭代计算表达式。键和计算值将添加到与该迭代相对应的数据中。

exists

(选答)键值对的关联数组或字典,用于将用户定义的键映射到字符串。如果输出中存在字符串,则该变量设置为 True,否则,该变量设置为 False。

fields

(选答)键值对的关联数组或字典,用于将用户定义的键映射到解析命令输出特定部分的嵌套表的名称。

filters

(选答)下 columns定义的一个或多个键的列表。最终数据集仅包括所选列中的数据。

regex

(选答)匹配所需内容的正则表达式列表。

视图名称

视图名称是视图的用户定义标识符。通过在 Table 定义中包含 view 该属性并提供 View 名称作为其参数,可以将 Table 与特定 View 相关联。

以下示例定义了一个名为 ChassisFanView的视图,该视图由 Table 的 view 参数引用:

列

您可以在视图中使用该 columns 参数来提取和解析以行和列格式化的命令输出。

考虑以下 show ospf neighbor 命令输出:

要提取数据,请在视图中包含 columns 参数,并将 Python 变量名称映射到列名。应用程序将从该列的命令输出中提取的键和值作为键值对存储在给定项的字典中。

以下视图从命令输出中的 show ospf neighbor 每一列中提取数据:

在 Junos PyEZ 应用程序中检索和打印数据时,每个邻居的数据都包含列键和对应的数据。

要筛选数据以仅包含所选列中的数据,请在视图中包含 filters 该参数。有关详细信息,请参阅 筛选器。

某些命令输出包括跨越多行的列标题,例如:

要在视图中定义多行列标题,请将列键元素设置为等于该标题每行中的单词列表。以下视图定义了上一个命令输出的列:

评估表达式 (eval)

您可以使用可选 eval 参数在表和视图返回的最终数据中添加或修改键值对。该 eval 参数将键名映射到包含数学表达式的字符串。您可以在表和视图中包含该 eval 参数,并且 eval 可以定义和计算多个值。

在表中使用时eval,它会引用完整的数据字典进行计算。键和计算值将作为单个附加项添加到字典中。在视图中使用时eval,将在数据的每次迭代时计算表达式。计算值将添加到该迭代的数据中。如果键名称与视图中定义的键匹配,eval则eval将该键的值替换为计算值。如果键名称与视图中定义的键不匹配,eval则eval将新键和计算值添加到数据中。

表达 eval 式可以引用 data 视图返回的字典。表达式必须使用 Jinja 模板变量进行引用 data ,以便 Junos PyEZ 可以在计算表达式时使用字典替换该变量。

从 Junos PyEZ 2.8.1 版开始,表和视图 eval 语句中使用的表达式将使用受限实现进行评估,以降低代码执行安全风险。在计算之前,Junos PyEZ 会根据一组受支持的 Python 语法、函数、方法和运算来解析和验证每个表达式。包含不受支持或不安全元素的表达式将被拒绝并显示 UnsafeExpressionError 错误。 表 2 概述了支持的表达式。

表 2:eval 语句中支持的表达式
类别 支持的语法 示例

算术

+ - * / // % **

a+b
a*100

布尔逻辑

and, or

a > 0 and b > 0

文字

整数、浮点数

123
3.14

字符串文字

'text'

字典文字

{'a':1}

列出文字

[1,2,3]

设置文字

{1,2,3}

元组文字

(1,2,3)

比较
运维人员

== != < <= > >=

{{ cpu }} > 80

词典
理解

{k:v for ...}

{k:v for k,v in {{ data }}.items()}

列表
理解

[expr for ...]

[v['errors'] for k,v in {{ data }}.items()]

设置
理解

{expr for ...}

{k for k in {{ data }}.keys()}

条件表达式

x if cond else y

'busy' if {{ cpu }} > 80 else 'idle'

功能

abs()—绝对值
dict()- 创建字典
isinstance()—类型检查
len()- 可迭代对象的长度
max()—最大值
min()- 最小值
sum()—求和一个可迭代对象

sum([1,2,3])

发电机
表达式

(expr for ...)

(v for v in {{ data }}.values())

索引

[n]

{{ data }}[0]

会员

in, not in

'xe' in {{ name }}

方法

endswith()- 字符串后缀检查
get()—字典安全查找
items()- 返回字典键和值
keys()- 返回字典键
values()- 返回字典值

{{ data }}.items()

切片

[start:end:step]

'{{ cpu }}'[:-1]

一元运算符

+x, , -xnot x

-{{ cpu }}

以下示例 eval 在视图定义中使用。该 cpu 条目修改数据字典中每个项的字段的 cpu 现有值。该 max 条目为数据字典中的每个项创建一个新的键值对。

请考虑vty命令的 show threads 以下示例输出:

View 的 eval 参数修改每个 cpu 条目以省略百分号 (%)。因此,数据包含“0”而不是“0%”。此外,它还为每个项目添加一个新键 max及其计算值。

有关表定义中使用的示例eval,请参阅评估表达式 (eval)。

存在

您可以在视图中使用可选 exists 参数来指示命令输出中是否存在字符串。 exists 是键值对的字典,用于将用户定义的 Python 变量名称映射到要在命令输出中匹配的字符串。如果输出中存在字符串,则该变量设置为 True。否则,该变量将设置为 False。

考虑 show host_loopback status-summary vty 命令输出。

下表定义 exists 了用于测试命令输出是否包含 No detected wedges 字符串或 No toolkit errors 字符串:

当您使用表和视图在 Junos PyEZ 应用程序中测试字符串并打印结果值时,在这种情况下,这两个变量都设置为。True

字段

命令输出可能冗长而复杂,您可能需要不同的逻辑来解析输出的不同部分。在某些情况下,您无法使用单个表和视图充分解析命令输出。要解析此类输出,可以在视图中包括可选 fields 参数。 fields 是键值对的字典,用于将用户定义的键映射到选择命令输出特定部分的嵌套表的名称。每个嵌套表都可以引用自己的视图,该视图解析该表选择的数据。

考虑 show xmchip 0 pt stats vty 命令输出,其中包含两个不同的数据部分:

以下 XMChipStatsView 视图使用该 fields 参数定义两个附加表,用于解析命令输出的两个不同部分。和 _WANPTStatTable _FabricPTStatTable 表分别从 和 WAN PT statistics Fabric PT statistics 部分提取数据。在这种情况下,表使用参数 delimiter 来提取和拆分数据。因此,表不需要引用单独的视图。

在 Junos PyEZ 应用程序中检索和打印数据时,在下 fields 定义的每个键都包含相应表选择和解析的数据。

再举一个示例,请考虑 show ttp statistics vty 命令输出:

FPCTTPStatsView视图使用该fields参数引用多个嵌套表,这些表提取输出不同部分中的数据。每个表引用自己的视图或使用delimiter参数来解析该部分中的数据。

在 Junos PyEZ 应用程序中检索和打印数据时,每个 fields 键都包含相应表提取和解析的数据。

过滤器

该 columns 参数从以行和列格式化的命令输出中提取数据。在视图中包含参数 columns 时,可以选择包含该 filters 参数以筛选最终输出中包含的列数据。该 filters 值是在 下 columns定义的一个或多个键的列表。最终数据集仅包括所选列中的数据。您可以在视图定义中提供默认过滤器,也可以在 Junos PyEZ 应用程序中定义或覆盖过滤器值。

考虑 show ospf neighbor 命令输出:

在以下视图中,参数 columns 为相应命令输出中的所有列定义键。使用 included filters 参数时,生成的数据字典仅包含 和 Address State 列中的数据。

以下 Junos PyEZ 代码首先不使用任何参数进行调用get(),该代码使用视图中定义的默认过滤器列表检索数据。第二个调用包含get()filters参数,该参数会覆盖视图中定义的筛选器列表。

执行应用程序时,第一次 get() 调用会使用视图中定义的过滤器。第二次调用使用调用中定义的筛选器,这些筛选器会覆盖视图中定义的筛选器。

正则表达式

可以使用视图中的可选 regex 参数来匹配和提取命令输出中的特定字段。 regex 是将键映射到正则表达式的字典。如果相应的 Table 未定义 item: '*',Junos PyEZ 将组合正则表达式,并将结果与每行输出进行匹配。但是,如果表定义 item: '*' 为将数据提取为单个文本字符串,则 Junos PyEZ 会将每个单独的正则表达式与整个文本字符串进行匹配。

正则表达式中定义的捕获组确定从字段中提取并存储在数据字典中的数据。如果定义捕获组,则数据中仅存储该组的值。否则,Junos PyEZ 将存储与完整表达式匹配的值。例如, (d+.d+) 从字符串搜索表达式中检索并存储浮点值,而仅 (d+).d+ 存储数据的整数部分。如果定义多个组,则仅存储第一个组的值。

Junos PyEZ 利用该 pyparsing 模块定义了许多内置关键字,您可以使用这些关键字来代替正则表达式。 表 3 列出了关键字、简要说明和相应的表达式,其中 pp 派生自 import pyparsing as pp。

表 3:正则表达式参数关键字

关键词

描述

表达式

hex_numbers

仅包含十六进制字符的单词

hex_numbers = pp.OneOrMore(pp.Word(pp.nums, min=1))
    & pp.OneOrMore(pp.Word('abcdefABCDEF', min=1))

numbers

由整数或浮点值组成的单词

numbers = (pp.Word(pp.nums) + pp.Optional(pp.Literal('.') +
     pp.Word(pp.nums))).setParseAction(lambda i: ''.join(i))

percentage

由数字和尾随百分号 (%) 组成的单词

percentage = pp.Word(pp.nums) + pp.Literal('%')

printables

一个或多个由可打印字符(任何非空格字符)组成的单词

printables = pp.OneOrMore(pp.Word(pp.printables))

word

由字母或字母数字字符组成的单词

word = pp.Word(pp.alphanums) | pp.Word(pp.alphas)

words

一个或多个 word 字符串

words = (pp.OneOrMore(word)).setParseAction(lambda i: ' '.join(i))

考虑以下 show icmp statistics 命令输出。输出的每个部分都位于特定的部分标题下,数据由一个数字和一个或多个单词组成。

要解析前面的输出,主视图 fields定义 ,它引用解析输出每个部分的嵌套表和视图。嵌套视图定义了 regex 与相应表提取的数据进行匹配的参数。

例如, _ICMPDiscardsTable 表在命令输出中选择 ICMP Discards 部分下的数据。“视图”定义 _ICMPDiscardsView 了两个键, value 以及 name,它们映射到正则表达式。 value 匹配一个或多个数字,并 name 匹配一个或多个单词。由于 Table 未定义 item: '*',因此正则表达式将组合并与该部分中的每一行数据进行匹配。

“表”( _ICMPErrorsTable Table) 选择命令输出中部分 ICMP Errors 下的数据。视图定义 _ICMPErrorsView 了 和 error name 键。这些字段使用内置关键字 numbers , words 而不是显式定义正则表达式。

如果 Table 定义 item: '*',则提取的数据被视为一个文本字符串。在这种情况下,相应视图中的每个正则表达式都与整个字符串匹配。

考虑 show ithrottle id 0 命令输出。

下表用于 item: '*' 将数据提取为单个字符串。View 的 regex 参数定义了三个正则表达式。每个正则表达式模式都与整个字符串匹配。由于正则表达式定义了捕获组,因此 Junos PyEZ 仅存储与组匹配的数据。

在 Junos PyEZ 应用程序中检索和打印数据时,数据将包含三个 regex 项,其中包含与该表达式的捕获组匹配的值。

变更历史表

是否支持某项功能取决于您使用的平台和版本。使用 功能资源管理器 确定您的平台是否支持某个功能。

发布
描述
2.8.1
从 Junos PyEZ 2.8.1 版开始,Table 和 View eval 语句中使用的表达式将使用受限实现进行评估。