在 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)'
我正在执行一个命令,我得到如下输出
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)'