在 powershell 中获取以特定字符串开头的行

Fetch line starting with a specific string in powershell

我正在执行一个命令,我得到如下输出

Identifier:  3    SFP
Connector:   7    LC
Transceiver: 7004404000000000 4,8,16_Gbps M5 sw Short_dist
Encoding:    6    64B66B 
Baud Rate:   140  (units 100 megabaud)
Length 9u:   0    (units km)
Length 9u:   0    (units 100 meters)
Length 50u (OM2):  3    (units 10 meters)
Length 50u (OM3):  10   (units 10 meters)
Length 62.5u:0    (units 10 meters)
Length Cu:   0    (units 1 meter)       
Vendor OUI:  00:05:1e
Vendor PN:   57-0000088-01   
Vendor Rev:  A   
Wavelength:  850  (units nm)
Options:     003a Loss_of_Sig,Tx_Fault,Tx_Disable
BR Max:      0   
BR Min:      0   
Date Code:   180316  
DD Type:     0x68
Enh Options: 0xfa
Status/Ctrl: 0xb2
Pwr On Time: 3.52 years (30822 hours)
E-Wrap Control: 0
O-Wrap Control: 0
Alarm flags[0,1] = 0x5, 0x40
Warn Flags[0,1] = 0x5, 0x40
Temperature: 32      Centigrade 
Current:     8.082   mAmps 
Voltage:     3311.6  mVolts 
RX Power:    -5.5    dBm (280.4uW) 
TX Power:    -2.8    dBm (523.1 uW) 

我只需要获取最后两行,即从其中的 RX 和 TX 开始。

我正在尝试

#$streamOut | Select-String -Pattern "^RX" | select -ExpandProperty line
$streamOut | Select-String -Pattern "RX" | select -ExpandProperty line

这是代码

$session = New-SSHSession -ComputerName $SAN_IP -Credential $cred
$Strem = New-SSHShellStream -SSHSession $Session
$streamOut=@()
$SystemView = $Strem.WriteLine("sfpshow $port_Num")  
sleep -Seconds 5      
$streamOut = @($Strem.read())
sleep -Seconds 5
$RXTX_Data = @($streamOut | ? { $_ -match "^RX" -or  $_ -match "^TX"})      

$RXTX_Data

当我在上面的代码中使用下面的解决方案时,它返回空白。 $streamOut 是数组

PS C:\Windows\system32> $streamOut.GetType()

IsPublic IsSerial Name                                     BaseType                                                                                                      
-------- -------- ----                                     --------                                                                                                      
True     True     Object[]                                 System.Array                                                                                                  

但它返回了整个输出。

请让我知道这件事

试试这个:

$streamOut = Get-Content -Path "Your_Output_FilePath"
$streamOut | ? { $_ -match "^RX" -or  $_ -match "^TX"} 

如您所述,$streamOut 变量包含单个多行字符串。

在这种情况下,您可以像这样将 Select-String-AllMatches 一起使用:

$RXTX_Data = ($streamOut | Select-String -Pattern '(?m)^(RX|TX).*$' -AllMatches).Matches.Value
$RXTX_Data  # Output array of matching lines

输出:

RX Power:    -5.5    dBm (280.4uW)
TX Power:    -2.8    dBm (523.1 uW)

请注意,对 multiline mode 使用 (?m) 内联修饰符很重要,它会将 ^ 的行为更改为锚定行首,将 $ 的行为更改为锚定行尾行,而不是整个输入字符串的开头和结尾。

更简单的替代方法 是先将字符串拆分为多行,因此您可以使用 -match 运算符过滤匹配的行:

$streamLines = $streamOut -split '\r?\n'
$RXTX_Data = $streamLines -match '^(RX|TX)'

这是有效的,因为当 LHS 操作数是像数组这样的集合时,-match 和其他 comparison operators 充当过滤器。我们不需要多行模式,因为 RegEx 会单独应用于每个数组元素(行)。

以上两行甚至可以压缩成一个one-liner:

$RXTX_Data = ($streamOut -split '\r?\n') -match '^(RX|TX)'