【问题标题】:Why is my TCL expression returning duplicate results为什么我的 TCL 表达式返回重复的结果
【发布时间】:2017-11-27 10:04:00
【问题描述】:

我正在尝试使用 TCL 处理 cisco 路由器上的所有接口。目前我正在使用以下两个命令:

set int_out [exec "show interface description"]

输出

Interface                      Status         Protocol Description
Fa0/0                          up             up       ** REDACTED **
Fa0/0.209                      up             up       ** REDACTED **
Fa0/0.790                      up             up       ** REDACTED **
Fa0/1                          admin down     down

.

foreach int [regexp -all -line -inline "^(\[^ ]+)" $int_out] { show clock; puts $int }

输出

18:25:16.461 UTC Fri Jun 23 2017Interface

18:25:16.465 UTC Fri Jun 23 2017Interface

18:25:16.469 UTC Fri Jun 23 2017Fa0/0

18:25:16.469 UTC Fri Jun 23 2017Fa0/0

18:25:16.473 UTC Fri Jun 23 2017Fa0/0.209

18:25:16.473 UTC Fri Jun 23 2017Fa0/0.209

18:25:16.477 UTC Fri Jun 23 2017Fa0/0.790

18:25:16.477 UTC Fri Jun 23 2017Fa0/0.790

18:25:16.481 UTC Fri Jun 23 2017Fa0/1

18:25:16.481 UTC Fri Jun 23 2017Fa0/1

我的目标是从 show interface description 生成的每一行输出中获取接口名称,然后在屏幕上打印出来。但是正如你所看到的,当我在屏幕上打印数据时,我得到了重复。我最初认为这可能是由于某种屏幕上的日志记录功能,但我在输出中包含的时间戳似乎另有说明。例如,第一个接口行的时间戳为 18:25:16.461,而第二个接口行的时间戳为 18:25:16.465。

我可以做些什么来解决这个问题?我认为这可能是我的正则表达式字符串的问题,它从每行中抓取第一个单词。

【问题讨论】:

    标签: regex scripting tcl


    【解决方案1】:

    问题在于regexp -inline 为整个匹配返回一个单词并且为每个子匹配返回一个单词。这里,我们来看一个简单的例子:

    puts [regexp -all -inline {.(.).} "abcdef"]
    

    这会产生这个输出:

    abc b 定义

    当您创建一个匹配字符串的所有非空部分的子 RE 时,就像您在 ^([^ ]+) 中所做的那样,您会得到整个匹配的字符串显然返回了两次。

    您可能的修复方法是更改​​ RE 使其不使用捕获括号(在您的情况下,您可以使用 ^[^ ]+,通过 Tcl 解析器获取它所需的任何反斜杠),或者使用foreach 的多变量形式,以便您处理(忽略?)所有您不关心的匹配子部分:

    foreach {int inner} [regexp -all -line -inline "^(\[^ ]+)" $int_out] {
        show clock
        puts $int
    }
    

    (FWIW,通常建议您将 RE 放入 {braces} 以避免添加大量反斜杠。这不是您的问题,但无论如何它都是很好的风格。)

    【讨论】:

    • 谢谢!那成功了。多变量形式的 foreach 也是个好主意
    猜你喜欢
    • 2022-01-07
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 1970-01-01
    相关资源
    最近更新 更多