请问有人能解释一下 sls(Select-String)与 grep 和 findstr 的区别吗?
grep:
grep 示例:
所以,我的想法是“好的,我需要将 Get-Service 输出的内容转换为字符串来使用 PowerShell 命令”,但这并不起作用(或者不是我期望的方式):
通常我应该如何将对象转换为字符串,以便它可以操作信息(就像
如果有人能解释一下上述内容是如何组合在一起的,那么我会更好地利用 sls。特别是,
grep:
grep <pattern> files.txt
sls: sls <pattern> files.txt
(默认参数位置为模式,然后是文件)grep 示例:
grep "search text" *.log
;cat *.log | grep "search text"
sls 示例:sls "search text" *.log
;cat *.log | grep "search text"
另外,所有 PowerShell 命令都不区分大小写,而 Linux 工具通常区分大小写,而像 findstr 这样的旧工具也是区分大小写的,但 findstr 可以在 PowerShell 中使用,并且适用于 sls 不适用的情况,例如:Get-Service | findstr "Sec"
(这可以正常工作!),但是当我们尝试以类似的方式使用 sls 时 Get-Service | sls "Sec"
我们什么都没有得到(可能是因为 sls 使用字符串,但 Get-Service 返回一个对象,所以这是可以理解的,但是 findstr 在做什么,它怎么能将输出视为字符串呢?)。所以,我的想法是“好的,我需要将 Get-Service 输出的内容转换为字符串来使用 PowerShell 命令”,但这并不起作用(或者不是我期望的方式):
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
”因为它似乎将每一行作为单个字符串传递给findstr,对吗? - YorSubsfindstr
解释令人困惑。实际上,当将数据传输到外部程序时,PowerShell 隐式 暗示了Out-String -Stream
,对于非字符串输入到Select-Object
也应该这样做(请参见 https://github.com/PowerShell/PowerShell/issues/10726)。也就是说,PowerShell 将有效地Out-String -Stream
字符串化输入的每一行提供给findstr
,并且 PowerShell 不可避免地以换行符终止每个字符串化的输入(行)。/cc @YorSubs。 - mklement0