我在網上查看了許多解決方案,但沒有一個與我的具體情況有關。我有以下 PowerShell 命令輸出:
PS C:\Users\Administrator> Query User | Select-String "rdp"
>administrator rdp-tcp#7 2 Active . 4/28/2022 10:22 AM
如果我使用 bash,那么使用 awk 選擇第二列(這是我需要的列)將是一個簡單的例子。
誰能幫助我如何在 PowerShell 中獲得相同的結果?
uj5u.com熱心網友回復:
您可能只是$ENV:SESSIONNAME用來獲取該字串。
如果你想玩一些代碼來“模擬”awk,你可以使用
((Query User) -match 'rdp' -split '\s ')[1]
筆記:
(Query User)Query User- 由...回傳的字串... -match 'rdp'- 首先與 匹配rdp,一旦獲得匹配,... -split '\s '- 它被一個或多個空格分割。(...)[1]- 然后,使用索引回傳第二個專案[1](因為陣列索引是從零開始的)。
uj5u.com熱心網友回復:
Wiktor Stribi?ew 的回答為單個匹配行提供了一個有效的解決方案(在這種情況下,這可能是所需要的全部)。
概括和詳細說明AWK角度:
如果需要從多行中提取欄位,則需要多次呼叫
-split操作員。- 它是一元形式 of
-split,如下面使用的,在欄位拆分方面表現類似于 AWK,因為任何非空的空白運行分隔欄位,前導和尾隨空白被忽略。
- 它是一元形式 of
要逐行處理多行,您可以使用
switch同樣受 AWK 啟發的陳述句。
此 AWK 命令的等效項,它從包含字串“rdp”的每一行中提取第二個欄位:
query user | awk '/rdp/ { print $2 }'
是這個switch宣告:
switch -Regex (query user) { 'rdp' { (-split $_)[1] } }
筆記:
0-based陣列索引適用于 PowerShell,因為-split運算子回傳一個標記陣列;相比之下,AWK 的欄位編號以$1($0代表整行) 開頭。也就是說,$2AWK 中的欄位對應1PowerShell 中的陣列索引。-CaseSensitive需要時添加;默認情況下,PowerShell 不區分大小寫。
可選閱讀:grep與Select-String:
另一個 Unix-utility 解決方案選項是使用grep,如下所示:
query user | grep -Eo '\brdp[^ ] '
PowerShell 的grep類比是Select-String.
從 PowerShell 7.2.2 開始,有一個未決的、綠燈的未來改進將Select-String允許只回傳匹配行的匹配部分,類似于grep's -o; 歡迎社區成員實施它 - 請參閱GitHub 問題 #7712。
# FUTURE improvement.
query user | Select-String -OnlyMatching '\brdp[^ ] '
目前,需要一個更詳細的解決方案:
query user | Select-String '\brdp[^ ] ' | ForEach-Object { $_.Matches.Value }
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/467590.html
上一篇:匿名遞回函式
