适用于控制台输出的 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 }