string - 使用 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”的每个字符,所以返回很多 - 如果是这样的话,我认为这不是很直观) ?
解决方案
默认情况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
开关进行字符串匹配)对每个输入字符串进行模式匹配,并输出与模式匹配的整个字符串。因此,如果您只将一个包含多行的单个字符串导入其中,那么所有行都将在成功匹配时返回。
推荐阅读
- virtual-machine - 没有拿起第二个虚拟机
- elixir - 运行混合测试时在 :dev env 上是否正常?
- menu - 自动设置活动项目
- sql-server - 如何从 python 与 mssql 交互?
- python - 如何正确比较时间(以分钟和小时表示)?
- solr - SolrJ 是在 Java 环境中使用 Solr 的推荐方法吗?
- delphi - 致命错误 EDebug.pas(3094):无法创建输出文件 P:\Trails\Gui\SD\obj\EDebug.dcu
- c# - Dapper QueryAsync 消息返回任务取消
- php - WooCommerce - 在结帐页面和电子邮件的本地取货时隐藏帐单地址
- javascript - TypeError:无法读取未定义的属性“setState”,以响应 axios 在反应 JS 中获取数据