我使用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()
}
}
答案 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
参数执行正则表达式匹配。
如果编辑条目的格式是可预测的,我们可以假设我们将始终按此顺序依次有edit
,vdom
,inbandwidth
和outbandwidth
行。这意味着我们可以假设我们将按该顺序进行匹配,因此一旦edit
被匹配,就可以输出所有outbandwidth
块匹配。
正则表达式(regexes)是每行单引号内的值。以下是使用的两种类型的表达式的细分:
^edit "(?<edit>[^"]+)"
:
- ^声明行首的位置
- edit与按字面编辑的字符匹配(不区分大小写)
- 命名捕获组编辑(?[^“] +)
- 匹配列表[^“] +中不存在的单个字符,这表示不是双引号字符。
- 量词(+)-匹配一次和无限次,并尽可能多地匹配,并根据需要返回(贪婪)
- ”从字面上匹配字符“(区分大小写)
^set inbandwidth (?<inb>\d+)
:
- ^声明行首的位置
- set inbandwidth与字面上设置的inbandwidth字符完全匹配(不区分大小写)
- 命名捕获组inb(?\ d +)
- \ d +匹配一个数字(等于[0-9])
- 量词(+)-匹配一次和无限次,并尽可能多地匹配,并根据需要返回(贪婪)