适用于控制台输出的 PowerShell 中的 Awk 等效项 table
Awk equivalent in PowerShell to apply to console outputted table
我在网上看了很多解决方案,但none与我的具体情况有关。我有以下 PowerShell 命令输出:
PS C:\Users\Administrator> Query User | Select-String "rdp"
>administrator rdp-tcp#7 2 Active . 4/28/2022 10:22 AM
如果我使用 bash,使用 awk 到 select 第二列(这是我需要的那一列)将是一个简单的例子。
任何人都可以帮助我如何在 PowerShell 中实现相同的结果?
您可以只使用 $ENV:SESSIONNAME
来获取该字符串。
如果您想使用一些代码来“模拟”awk,您可以使用
((Query User) -match 'rdp' -split '\s+')[1]
注:
(Query User)
- Query User
... 返回的字符串
... -match 'rdp'
- 首先与rdp
匹配,一旦获得匹配,
... -split '\s+'
- 用一个或多个空格分隔。
(...)[1]
- 然后,使用索引返回第二项,[1]
(因为数组索引是 zero-based)。
为 单个 匹配线提供了有效的解决方案(在这种情况下可能需要全部)。
概括和阐述AWK角度:
如果需要从多行中提取字段,则需要多调用-split
运算符。
- 它是一元形式,
-split
,如下所用,在字段拆分方面表现AWK-like,因为任何非空运行 的空格分隔字段,忽略前导和尾随空格。
多行一行一行处理,可以用switch
语句,也就是AWK-inspired
此 AWK 命令的等效项,它从包含字符串“rdp”的每一行中提取第二个字段:
query user | awk '/rdp/ { print }'
这是switch
声明:
switch -Regex (query user) { 'rdp' { (-split $_)[1] } }
注:
0
-based array 索引适用于 PowerShell,因为 -split
运算符 returns 一个令牌数组;相比之下,AWK 的字段编号以 </code> 开头(<code>[=22=]
代表整行)。即AWK中的字段</code>对应PowerShell中的数组索引<code>1
.
如果需要请添加-CaseSensitive
; PowerShell 默认为 case-INsensitive。
可选阅读:grep
vs. Select-String
:
另一种Unix-utility的解决方案是使用grep
,如下:
query user | grep -Eo '\brdp[^ ]+'
PowerShell 的 grep
模拟是 Select-String
。
从 PowerShell 7.2.2 开始,有一个待定的 green-lighted 未来改进 到 Select-String
将允许仅返回匹配的匹配部分行,类似于 grep
的 -o
;欢迎社区成员实施它 - 请参阅 GitHub issue #7712.
# FUTURE improvement.
query user | Select-String -OnlyMatching '\brdp[^ ]+'
目前,需要更详细的解决方案:
query user | Select-String '\brdp[^ ]+' | ForEach-Object { $_.Matches.Value }
我在网上看了很多解决方案,但none与我的具体情况有关。我有以下 PowerShell 命令输出:
PS C:\Users\Administrator> Query User | Select-String "rdp"
>administrator rdp-tcp#7 2 Active . 4/28/2022 10:22 AM
如果我使用 bash,使用 awk 到 select 第二列(这是我需要的那一列)将是一个简单的例子。
任何人都可以帮助我如何在 PowerShell 中实现相同的结果?
您可以只使用 $ENV:SESSIONNAME
来获取该字符串。
如果您想使用一些代码来“模拟”awk,您可以使用
((Query User) -match 'rdp' -split '\s+')[1]
注:
(Query User)
-Query User
... 返回的字符串
... -match 'rdp'
- 首先与rdp
匹配,一旦获得匹配,... -split '\s+'
- 用一个或多个空格分隔。(...)[1]
- 然后,使用索引返回第二项,[1]
(因为数组索引是 zero-based)。
概括和阐述AWK角度:
如果需要从多行中提取字段,则需要多调用
-split
运算符。- 它是一元形式,
-split
,如下所用,在字段拆分方面表现AWK-like,因为任何非空运行 的空格分隔字段,忽略前导和尾随空格。
- 它是一元形式,
多行一行一行处理,可以用
switch
语句,也就是AWK-inspired
此 AWK 命令的等效项,它从包含字符串“rdp”的每一行中提取第二个字段:
query user | awk '/rdp/ { print }'
这是switch
声明:
switch -Regex (query user) { 'rdp' { (-split $_)[1] } }
注:
0
-based array 索引适用于 PowerShell,因为-split
运算符 returns 一个令牌数组;相比之下,AWK 的字段编号以</code> 开头(<code>[=22=]
代表整行)。即AWK中的字段</code>对应PowerShell中的数组索引<code>1
.如果需要请添加
-CaseSensitive
; PowerShell 默认为 case-INsensitive。
可选阅读:grep
vs. Select-String
:
另一种Unix-utility的解决方案是使用grep
,如下:
query user | grep -Eo '\brdp[^ ]+'
PowerShell 的 grep
模拟是 Select-String
。
从 PowerShell 7.2.2 开始,有一个待定的 green-lighted 未来改进 到 Select-String
将允许仅返回匹配的匹配部分行,类似于 grep
的 -o
;欢迎社区成员实施它 - 请参阅 GitHub issue #7712.
# FUTURE improvement.
query user | Select-String -OnlyMatching '\brdp[^ ]+'
目前,需要更详细的解决方案:
query user | Select-String '\brdp[^ ]+' | ForEach-Object { $_.Matches.Value }