You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell统计日志中ms后2/4/5开头状态码的出现次数

修正PowerShell代码实现日志状态码分组统计

按具体状态码分组统计(如200、404、500)

以下代码可准确匹配日志中ms 2xx/ms 4xx/ms 5xx格式的行,按具体三位状态码分组计数并生成表格:

# 定义目标日志文件路径,支持通配符和具体路径
$logPaths = "*.txt", "*.log"

Get-ChildItem -Path $logPaths -File | ForEach-Object {
    # 匹配"ms "后接三位数字的内容,捕获状态码
    Select-String -Path $_.FullName -Pattern 'ms (\d{3})' | Where-Object {
        # 仅保留2/4/5开头的状态码
        $_.Matches.Groups[1].Value -match '^[245]\d{2}$'
    } | ForEach-Object {
        # 转换为结构化对象,方便后续分组
        [PSCustomObject]@{
            StatusCode = $_.Matches.Groups[1].Value
        }
    }
} | Group-Object -Property StatusCode | ForEach-Object {
    # 生成统计结果
    [PSCustomObject]@{
        StatusCode = $_.Name
        Count      = $_.Count
    }
} | Format-Table -AutoSize

按状态码前缀分组统计(如2xx、4xx、5xx)

如果需要按开头数字分组统计所有同前缀状态码的总行数,可使用此版本:

$logPaths = "*.txt", "*.log"

Get-ChildItem -Path $logPaths -File | ForEach-Object {
    # 捕获2/4/5开头的状态码前缀
    Select-String -Path $_.FullName -Pattern 'ms ([245])\d{2}' | ForEach-Object {
        [PSCustomObject]@{
            StatusGroup = "$($_.Matches.Groups[1].Value)xx"
        }
    }
} | Group-Object -Property StatusGroup | ForEach-Object {
    [PSCustomObject]@{
        StatusGroup = $_.Name
        Count       = $_.Count
    }
} | Format-Table -AutoSize

原代码问题分析

之前的实现大概率存在以下问题:

  1. 正则表达式未正确设置捕获组,导致无法提取完整状态码,Group-Object只能基于模糊匹配结果分组
  2. 未添加状态码范围筛选,可能包含了非2/4/5开头的无效状态码
  3. 未将匹配结果转换为结构化对象,分组时无法识别明确的统计键

代码关键逻辑说明

  • Select-String -Pattern 'ms (\d{3})':用正则表达式精准匹配目标格式,通过捕获组(\d{3})提取三位状态码
  • Where-Object:过滤出仅符合要求的状态码范围,避免无效数据干扰统计
  • Group-Object:基于提取的状态码/状态码前缀进行分组,最终生成直观的统计表格

内容的提问来源于stack exchange,提问作者Gaara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 17:40:44