有人可以澄清与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
开关进行字符串匹配)来对每个输入字符串进行模式匹配,并输出与模式匹配的整个字符串。因此,如果仅将包含多行的单个字符串插入其中,则所有行将在成功匹配后返回。