有人可以澄清与grep和findstr相比sls(选择字符串)如何工作吗?

grep:grep <pattern> files.txt
sls:sls <pattern> files.txt(sls的默认参数位置是pattern,然后是file)

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”的每个字符,所以返回了很多东西-如果我认为这样做不是很直观) )?

最佳答案

默认情况下,当您使用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开关进行字符串匹配)来对每个输入字符串进行模式匹配,并输出与模式匹配的整个字符串。因此,如果仅将包含多行的单个字符串插入其中,则所有行将在成功匹配后返回。

08-24 15:43