Windows cmd 提示符/powershell 命令在“find”中带有 OR 吗?

Windows cmd 提示符/powershell 命令在“find”中带有 OR 吗?

我拥有 BSD/GNU/Linux 命令行经验。例如 ps aux | grep 'USER\|http' ,打印出包含单词“USER”的标题或任何包含“http”的行。
(反斜杠转义管道符号或竖线执行或部分 - “|”)

是否有与findWindows 中的命令等效的命令?

例如,Windows 10 命令提示符:获取其中包含数字 443 的监听端口行列表:

netstat -aonp TCP | find "443"

我想通过包含以单词 Proto 作为第一列的标题行(Proto Local Address Foreign Address State PID)来对其进行 OR 运算

我知道我不能使用反斜杠,因为它在 Windows 中的含义不同。不知道 Windows 中“|”的等价符号表示“或”。

它是否类似于... find "443" -o "Proto"Cmd 或 Powershell?

答案1

为了尝试:
command | findstr "string1[SPACE]string2"

netstat -aonp TCP | findstr "443 proto"

为了尝试:
(command | Out_String) | Select-String '(string1,string2)'

(netstat -aonp TCP | Out-String ) | sls '(proto|433)'

答案2

使用 PowerShell 并netstat结合Select-String

netstat -aonp TCP | Select-String -Pattern "443","Proto" -NoEmphasis

答案3

您还可以使用 RegEx 匹配对事物进行“或”操作。

(netstat -aonp TCP) -match 'proto|135|443'

在 DOS/CMD.exe 中,它有点麻烦,您更倾向于使用“FINDSTR”而不是“FIND”。例如:

netstat -aonp TCP | findstr /i /c:"proto" /c:"135" /c:"443"

# Create your own object to manipulate
Clear-Host
(((netstat -aonp TCP | 
Select-Object -Skip 3).trim()) -replace '\s\s+', ',')  | 
ConvertFrom-Csv | 
Format-Table -AutoSize
# Results
<#
Proto Local Address     Foreign Address    State       PID  
----- -------------     ---------------    -----       ---  
TCP   0.0.0.0:7         0.0.0.0:0          LISTENING   6892 
TCP   0.0.0.0:9         0.0.0.0:0          LISTENING   6892 
TCP   0.0.0.0:13        0.0.0.0:0          LISTENING   6892
...
#>

Clear-Host
(((netstat -aonp TCP | 
Select-Object -Skip 3).trim()) -replace '\s\s+', ',')  | 
ConvertFrom-Csv | 
Select-Object -Property '*' | 
Where-Object {$PSitem.'Foreign Address' -match '135|443'} | 
Format-Table -AutoSize
# Results
<#
Proto Local Address    Foreign Address    State        PID  
----- -------------    ---------------    -----        ---  
TCP   10.0.0.xxx:5xxx   xx.xx.240.xxx:443  ESTABLISHED 5716 
TCP   10.0.0.xxx:5xxx  xxx.xx.163.xxx:443  CLOSE_WAIT  19916
TCP   10.0.0.xxx:5xxx  xxx.xx.163.xxx:443  CLOSE_WAIT  19916
...
#>

仅供参考,如其他人或指出

全部都是PS。也可以看看:

Get-NetTCPConnection | 
Where-Object {$PSitem.RemotePort -match '445|443'}

答案4

这不是您所提问题的答案,但一般来说,在(非古老的)Windows 上,您在 Unix 上以文本形式执行的许多操作都可以在 PowerShell 中使用正确输入的数据来完成,这更像是 SQL 或 JSON,而不是 shell。对于这种情况:

  • 您可以使用“cmdlet”get-nettcpconnection,而不是运行程序(netstat)来获取有关 TCP 连接(或更确切地说是套接字端点)的信息

  • 您无需在文本输出中搜索子字符串,而是可以进行过滤。我假设你使用了,-a因为你想包含处于监听状态的套接字,并且真的想使用来查找进程(进程?)本地端口443 不是远程的。添加-localport 443会进行此过滤 - 并且不包括使用端口 4437 或 14430 或 22443 或具有进程号4430 或偏僻的端口 443 或 4439,文本搜索会包含这些端口,但您实际上并不想要。另一方面,如果您实际上想要远程端口 443(这实际上没有意义-a),请执行-remoteport 443

  • 默认情况下,nettcpconnection 结构不显示所属进程,但可以使用 format-table 进行覆盖,它会自动提供标题行,并且可以通过不同的 cmdlet get-process 获取有关进程的其他信息

作为一个实际的例子,我在 443 上没有任何内容,但是在 7022 上有一个虚拟机在监听:

PS C:\work> get-nettcpconnection -localport 7022  |format-table localaddress,localport,owningprocess

localaddress localport owningprocess
------------ --------- -------------
0.0.0.0           7022         12132

PS C:\work> get-process -id 12132

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
   1093      63   124696      91768      43.00  12132   1 VirtualBoxVM

您可以自定义有关进程的信息,甚至将它们组合成一个管道,以获取套接字信息和进程信息,但我需要更精确的要求。

相关内容