示例:使用操作脚本搜索文件
此示例脚本在运行 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