【问题标题】:Capturing key words from output in tcl从 tcl 的输出中捕获关键词
【发布时间】:2015-02-27 19:08:36
【问题描述】:

我目前有一个脚本可以登录到设备并运行命令。 该命令的结果与此类似:

version: xxxx
date of installation: yyyyy
all other random stuff
which takes up a whole
lot of other lines

由于我在许多不同的设备(相同类型)上运行它,所以关键字versiondate of installation 将始终相同。 我想捕获xxxxyyyy,这将因设备而异。

可能性:

  1. 捕获整个输出并在版本之后使用 bash 来隔离单词:或在安装之后:

  2. 使用tcl本身将version:和installation:后的word保存到一个文件中

我该如何进行选项 2? 我尝试通过tcl的正则表达式浏览,但无法提出解决方案

给出错误的修改代码:

foreach line [split $expect_out(buffer) "\n"] to set $line {
# if ([regexp {^version:} $line ] || [regexp {^date of } $line]){
     regexp {^version: (.+)} $line fullmatch vsn
     puts $fileId $vsn
     regexp {^date of installation: (.+)} $line fullmatch install
     puts $fileId $install
#}
}

不太确定 if 语句,所以我取消了它。其余代码仍然返回一个错误,指出 vsn 没有此类变量

【问题讨论】:

    标签: regex tcl expect


    【解决方案1】:

    假设您正在逐行读取输出,例如放入变量$line,您可以通过应用以下匹配项来获取您要查找的数据:

    regexp {^version: (.+)} $line fullmatch vsn
    regexp {^date of installation: (.+)} $line fullmatch install
    

    ^ 字符将匹配锚定到行首。在这两种情况下,整个匹配都存储在$fullmatch 中,但括号内匹配的部分存储在第二个变量中($vsn 用于第一个匹配,$install 用于第二个匹配)。

    【讨论】:

    • 我在找这个语法,非常感谢!
    • 所以这是有道理的,但是我如何逐行读取输出,我是这样获取整个输出的:expect_output(buffer)
    • 在这种情况下,您可以设置一个类似foreach line [split $expect_out(buffer) "\n"] 的循环来为每一行数据设置$line,然后检查循环体中的正则表达式。
    • @PeterLewerin 不完全是。如果您使用该模式,您将需要额外的开关 -lineanchor
    • @user2883071in a tclsh 我在您的问题中为您的示例设置了一个变量lines。然后我运行foreach line [split $lines "\n"] { if [regexp {^version: (.+)} $line fullmatch vsn] { puts $vsn } elseif [regexp {^date of installation: (.+)} $line fullmatch install] { puts $install } }(在每个左大括号后和每个puts 调用后使用换行符),它工作正常,按预期打印xxxxyyyyy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多