示例:使用操作脚本搜索文件
此示例脚本在运行 Junos OS 的设备上的文件中搜索与给定正则表达式匹配的行。此示例在jcs:grep
操作脚本中使用模板。
要求
此示例使用运行 Junos OS 的设备。
概述和操作脚本
该模板搜索 jcs:grep
ASCII 文件中与正则表达式匹配的行。该模板驻留在 junos.xsl 导入文件中,所有运行 Junos OS 的交换机、路由器和安全设备都提供标准 Junos OS 安装文件。 jcs:grep
要在脚本中使用模板,必须将 junos.xsl 文件导入脚本中,并将前缀映射到 jcs
由 URI http://xml.juniper.net/junos/commit-script/1.0 标识的命名空间。
在此示例中,模板所需的所有 jcs:grep
值都定义为全局参数。参数的值作为命令行参数传递到脚本中。以下脚本定义两个参数, filename
用于 pattern
存储输入文件路径和正则表达式的值。如果在执行脚本时省略任一参数,则脚本将生成错误并停止执行。否则,脚本会调用 jcs:grep
模板并传递提供的参数。
如果正则表达式包含语法错误,则 jcs:grep
模板会为文件中的每一行生成一 error: regex error
条消息。如果正则表达式语法有效,则模板将解析输入文件。对于每个匹配项,模板都会向结果树添加一个 <match>
包含 <input>
子标记的 <output>
元素。模板将匹配字符串写入子元素, <output>
并将相应的匹配行 <input>
写入子元素:
<match> { <input> <output> }
在 SLAX 脚本中 :=
,操作人员将模板调用的结果 jcs:grep
复制到临时变量,并针对该 node-set
变量运行函数。 :=
操作人员确保该 results
变量是节点集而不是结果树分片,以便脚本可以访问内容。XSLT 脚本明确调用等效步骤。然后,该脚本遍历所有生成的输入元素并打印每个匹配项。
XSLT 语法
<?xml version="1.0" standalone="yes"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0" version="1.0"> <xsl:import href="../import/junos.xsl"/> <xsl:variable name="arguments"> <argument> <name>filename</name> <description>name of file in which to search for the specified pattern </description> </argument> <argument> <name>pattern</name> <description>regular expression</description> </argument> </xsl:variable> <xsl:param name="filename"/> <xsl:param name="pattern"/> <xsl:template match="/"> <op-script-results> <xsl:choose> <xsl:when test="$filename = ''"> <xnm:error> <message>missing mandatory argument 'filename'</message> </xnm:error> </xsl:when> <xsl:when test="$pattern = '';"> <xnm:error> <message>missing mandatory argument 'pattern'</message> </xnm:error> </xsl:when> <xsl:otherwise> <xsl:variable name="results-temp"> <xsl:call-template name="jcs:grep"> <xsl:with-param name="filename" select="$filename"/> <xsl:with-param name="pattern" select="$pattern"/> </xsl:call-template> </xsl:variable> <xsl:variable xmlns:ext="http://xmlsoft.org/XSLT/namespace" name="results" select="ext:node-set($results-temp)"/> <output> <xsl:value-of select="concat('Search for ', $pattern, ' in ', $filename)"/> </output> <xsl:for-each select="$results//input"> <output> <xsl:value-of select="."/> </output> </xsl:for-each> </xsl:otherwise> </xsl:choose> </op-script-results> </xsl:template> </xsl:stylesheet>
SLAX 语法
version 1.0; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; import "../import/junos.xsl"; var $arguments = { <argument> { <name> "filename"; <description> "name of file in which to search for the specified pattern"; } <argument> { <name> "pattern"; <description> "regular expression"; } } param $filename; param $pattern; match / { <op-script-results> { if ($filename = '') { <xnm:error> { <message> "missing mandatory argument 'filename'"; } } else if ($pattern = '') { <xnm:error> { <message> "missing mandatory argument 'pattern'"; } } else { var $results := { call jcs:grep($filename, $pattern); } <output> "Search for " _ $pattern _ " in " _ $filename; for-each ($results//input) { <output> .; } } } }
配置
程序
逐步过程
要下载、启用和运行脚本:
将 XSLT 或 SLAX 脚本复制到文本文件中,根据需要将文件命名 为 grep.xsl 或 grep.slax ,并将其下载到设备上的 /var/db/script/op/ 目录中。
在配置模式下,在
file
层次结构级别包括语句[edit system scripts op]
,并根据需要将 grep.xsl 或 grep.slax 包含在内。[edit system scripts op] user@host# set file grep.(slax | xsl)
commit and-quit
发出命令以提交配置并返回到操作模式。[edit] user@host# commit and-quit
通过发出
op grep filename filename pattern pattern
操作模式命令来执行操作脚本。
验证
验证脚本参数
目的
验证参数名称和说明是否显示在命令行界面 (CLI) 帮助中。
行动
发出 op grep ?
操作模式命令。CLI 根据脚本中的全局变量 arguments
中的定义,列出了脚本参数的可能补全。
user@host> op grep Possible completions: <[Enter]> Execute this command <name> Argument name detail Display detailed output filename name of file in which to search for the specified pattern pattern regular expression | Pipe through a command
验证操作脚本执行
目的
验证脚本是否按预期运行。
行动
如果发出 op grep
命令,但无法提供文件名或 regex 模式,则脚本会发出错误消息并停止执行。例如:
user@host> op grep filename /var/log/messages error: missing mandatory argument 'pattern' user@host> op grep pattern SNMP_TRAP_LINK_DOWN error: missing mandatory argument 'filename'
发出 op grep filename filename pattern pattern
命令时,脚本会列出输入文件中与正则表达式匹配的所有行。
user@host> op grep filename /var/log/messages pattern SNMP_TRAP_LINK_DOWN Search for SNMP_TRAP_LINK_DOWN in /var/log/messages Feb 24 09:04:00 host mib2d[1325]: SNMP_TRAP_LINK_DOWN: ifIndex 543, ifAdminStatus down(2), ifOperStatus down(2), ifName lt-0/1/0.9 Feb 24 09:04:00 host mib2d[1325]: SNMP_TRAP_LINK_DOWN: ifIndex 542, ifAdminStatus down(2), ifOperStatus down(2), ifName lt-0/1/0.10