首页 > 解决方案 > 使用 PowerShell sls (Select-String) vs grep vs findstr

问题描述

与 grep 和 findstr 相比,有人可以澄清 sls(Select-String)的工作原理吗?

grep:grep <pattern> files.txt

sls:sls <pattern> files.txt (sls的默认参数位置是模式然后是文件)

grep 示例:grep "search text" *.log ; cat *.log | grep "search text"

sls示例:sls "search text" *.log;cat *.log | grep "search text"

顺便说一句,所有 PowerShell Cmdlet 都不区分大小写,这与 Linux 工具通常始终区分大小写不同,但 findstr 等旧工具也区分大小写,但 findstr 可以在 PowerShell 中使用,并且可以在 sls 不区分大小写的情况下使用,例如:(Get-Service | findstr "Sec"这没有问题!),但是当我们尝试以类似的方式使用 sls 时,Get-Service | sls "Sec"我们什么也得不到(可能这会失败,因为 sls 使用字符串,但 Get-Service 返回一个对象,所以这是可以理解的 - 但是那么 findstr 在做什么,因为它可以将输出视为字符串?)。

因此,我的想法是“好的,我需要将 Get-Service 的输出转换为字符串以与 PowerShell Cmdlet 一起使用”,但这不起作用(或者不是以我期望的方式):

Get-Service | Out-String | sls "Sec"(给出结果,但很奇怪)

(Get-Service).ToString() | sls "Sec"(.ToString() 只返回“System.Object[]”)

一般来说,我应该如何将一个对象变成一个字符串,以便它可以操纵信息(以同样Get-Service | findstr "Sec"容易做到的方式)?

如果有人能澄清以上内容如何组合在一起,我将不胜感激,以便我可以更多地使用 sls。特别是,Get-Service | Out-String | sls "Sec"确实返回了东西,而不是我期望的东西(它是否搜索“s”和“e”和“c”的每个字符,所以返回很多 - 如果是这样的话,我认为这不是很直观) ?

标签: stringpowershellconsole

解决方案


默认情况Out-String下,它会将管道输入对象(在本例中为服务对象数组)转换为单个字符串。幸运的是,该-Stream开关允许将每行输出为单个字符串。关于区分大小写,Select-String支持-CaseSensitive切换。

# For case-insensitive regex match
Get-Service | Out-String -Stream | Select-String "Sec"

# For case-sensitive regex match
Get-Service | Out-String -Stream | Select-String "Sec" -CaseSensitive

# For case-sensitive non-regex match
Get-Service | Out-String -Stream | Select-String "Sec" -CaseSensitive -SimpleMatch

在任何一种情况下,都Select-String使用正则表达式(使用-SimpleMatch开关进行字符串匹配)对每个输入字符串进行模式匹配,并输出与模式匹配的整个字符串。因此,如果您只将一个包含多行的单个字符串导入其中,那么所有行都将在成功匹配时返回。


推荐阅读