在文本或文件中按正则搜索,输出带文件名和行号的 MatchInfo 对象。
Select-String 逐行搜索字符串或文件,默认使用正则表达式且不区分大小写,输出 Microsoft.PowerShell.Commands.MatchInfo 对象,包含 Path、LineNumber、Line、Matches、Context;别名是 sls。-SimpleMatch 关闭正则,-List 每个文件只返回首个匹配,-Quiet 只返回布尔值,-AllMatches 返回一行中的全部匹配,-Context 带前后行。
管道:-InputObject 按值接收字符串行,-Path 可按属性名接收路径;把 Get-ChildItem -Recurse -File 的结果接过来可批量搜文件。权限:读取目标文件需要相应 ACL,无权文件会产生错误。边界:它只做文本搜索,不解析 CSV/JSON 结构;按字段筛选应先解析对象。
版本:5.1 与 7.x 的匹配语义基本一致。7.x 差异:支持 -Raw 直接输出匹配到的字符串;默认编码为 UTF-8,5.1 无 BOM 文件按系统 ANSI 读取,编码不一致会漏匹配。
# 1. 在一组日志中搜错误和警告,先取前 20 条
PS C:\> Select-String -Path C:\Logs\*.log -Pattern 'ERROR|WARN' | Select-Object -First 20
# 2. 字面量搜索配置项,避免 . 和 \ 被当成正则
PS C:\> Select-String -Path C:\App\*.config -Pattern 'connectionString' -SimpleMatch -List
# 3. 从管道搜索并显示前后各 2 行上下文
PS C:\> Get-Content C:\Logs\app.log | Select-String -Pattern 'timeout' -Context 2, 2
# 4. 找出不含 Exception 的行,输出对象而不是文本
PS C:\> Select-String -Path C:\Logs\*.log -Pattern 'Exception' -NotMatch | Select-Object Path, LineNumber, Line
# 5. 用 -Quiet 做条件判断,脚本里比解析输出可靠
PS C:\> if (Select-String -Path C:\Logs\app.log -Pattern 'FATAL' -Quiet) { 'found fatal' }
# 6. 提取一行中的全部匹配;默认每行只返回一个 MatchInfo
PS C:\> Select-String -Path C:\Data\*.csv -Pattern '(\d{3})-(\d{4})' -AllMatches | ForEach-Object { $_.Matches.Value }
.、\、(、[ 都有特殊含义;搜字面量加 -SimpleMatch,或对模式用 [regex]::Escape()。MatchInfo 对象,不是字符串;直接 -eq 'ERROR' 不会成立,取 .Line 或 .Matches.Value。-CaseSensitive;验证时用同一行的大小写变体对比。-Path 不递归,C:\Logs\*.log 只覆盖当前层;递归用 Get-ChildItem -Recurse -File | Select-String。MatchInfo;要全部值加 -AllMatches,再展开 .Matches。-Encoding 后复测。-Quiet 返回布尔值并短路,不会给出匹配位置;既要判断又要位置时不要用它。findstr — CMD 的文本搜索,参数和正则方言不同。Get-Content — 先读取内容再交给 Select-String。Where-Object — 按对象属性筛选,不解析文本。Get-ChildItem — 递归生成待搜索文件列表。合上页面,先回答,再展开对照。
Select-String 的输出能直接和字符串比较吗?应该取哪个属性?config.json 里的 . 可能得到意外结果?.log 文件,-Path C:\Logs\*.log 够吗?MatchInfo 对象;取 .Line、.Path、.LineNumber 或 .Matches.Value。. 匹配任意字符;需要字面量时加 -SimpleMatch 或转义。-Path 只匹配当前层;用 Get-ChildItem C:\Logs -Recurse -File -Filter *.log | Select-String ...。
小程序版
微信扫码,随时查命令