如何过滤Powershell SSH输出

时间:2019-12-20 12:52:17

标签: powershell ssh filter

我使用PowerShell, read/write to SSH.NET streams中描述的脚本从防火墙获取信息。但是,我只需要隔离4个值。

编辑“ 测试连接1
    设置vdom“ test1
    设置IP 192.168.0.1 255.255.255.0
    设置allowaccess ping
    设置带宽 10000
    设置出带宽 10000
编辑“ 测试连接2
    设置vdom“ test1
    设置IP 192.168.1.1 255.255.255.0
    设置allowaccess ping
    设置带宽 10000
    设置出带宽 10000
-
编辑“ 测试连接3
    设置vdom“ test2
    设置IP 192.168.2.1 255.255.255.0
    设置allowaccess ping
    设置带宽 10000
    设置带宽 10000

我只需要显示粗体值。需要在每个“编辑”上创建新行。这些值可以用逗号分隔。

我需要得到以下结果

test-connection,test1,10000,10000
test-connection2,test1,10000,10000
test-connection3,test2,10000,10000

如何处理在函数中创建的输出

function ReadStream($reader)
{
    $line = $reader.ReadLine();
    while ($line -ne $null)
    {
        $line
        $line = $reader.ReadLine()
    }
}

1 个答案:

答案 0 :(得分:0)

如果每次编辑都是可以预测的,则可以执行以下操作:

switch -Regex -File edit.txt {
  '^edit "(?<edit>[^"]+)"' {$edit = $matches.edit}
  '^set vdom "(?<vdom>[^"]+)"' {$vdom = $matches.vdom}
  '^set inbandwidth (?<inb>\d+)' {$inb = $matches.inb}
  '^set outbandwidth (?<outb>\d+)' { $edit,$vdom,$inb,$matches.outb -join ","}
}

$matches是一个自动变量,其中包含使用-match运算符进行字符串比较的结果。每次成功匹配都会覆盖该变量。可以使用成员访问运算符.通过捕获组值的名称来访问捕获组值。这就是为什么您看到语法$matches.edit来检索edit捕获组的值的原因。

switch语句可以使用-File参数逐行读取文件,并使用-Regex参数执行正则表达式匹配。

如果编辑条目的格式是可预测的,我们可以假设我们将始终按此顺序依次有editvdominbandwidthoutbandwidth行。这意味着我们可以假设我们将按该顺序进行匹配,因此一旦edit被匹配,就可以输出所有outbandwidth块匹配。

正则表达式(regexes)是每行单引号内的值。以下是使用的两种类型的表达式的细分:

  

^edit "(?<edit>[^"]+)"

     
      
  • ^声明行首的位置
  •   
  • edit与按字面编辑的字符匹配(不区分大小写)
  •   
  • 命名捕获组编辑(?[^“] +)
  •   
  • 匹配列表[^“] +中不存在的单个字符,这表示不是双引号字符。
  •   
  • 量词(+)-匹配一次和无限次,并尽可能多地匹配,并根据需要返回(贪婪)
  •   
  • ”从字面上匹配字符“(区分大小写)
  •   
     

^set inbandwidth (?<inb>\d+)

     
      
  • ^声明行首的位置
  •   
  • set inbandwidth与字面上设置的inbandwidth字符完全匹配(不区分大小写)
  •   
  • 命名捕获组inb(?\ d +)
  •   
  • \ d +匹配一个数字(等于[0-9])
  •   
  • 量词(+)-匹配一次和无限次,并尽可能多地匹配,并根据需要返回(贪婪)
  •