как подсчитать разделенные слова шаблона select-string powershell. текстовый файл журнала жизни .txt .log

Мне нужно посчитать строки со значениями ms 2xx (где xx - любое число) это может быть 200,201,202,258,269 и т.д. (должно начинаться с числа 2) Затем сделайте это также с числами 4 и 5.

В моем файле .txt есть такие строки:

      2022.10.20 13:42:01.570 | INFO | Executed action "PERPIRestEPService.Controllers.PERPIController.GetVersion (PERPIRestEPService)" in 4.9487ms
2022.10.20 13:42:01.570 | INFO | Executed endpoint '"PERPIRestEPService.Controllers.PERPIController.GetVersion (PERPIRestEPService)"'
2022.10.20 13:42:01.570 | INFO | Request finished in 5.5701ms 200 application/json; charset=utf-8
2022.10.20 13:42:01.908 | DBUG | Starting HttpMessageHandler cleanup cycle with 4 items
2022.10.20 13:42:01.908 | DBUG | Ending HttpMessageHandler cleanup cycle after 0.0105ms - processed: 4 items - remaining: 0 items
2022.10.20 13:44:30.632 | DBUG | Received data from rabbit: <?xml version="1.0"?>
<TransactionJournal xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.datapac.sk/Posybe">
  <Header>
    <GeneratedDate>2022-10-20T13:44:30.5409065+02:00</GeneratedDate>
    <BusinessDate>2022-10-20</BusinessDate>
    <SourceSystem>Posybe MCFS</SourceSystem>
    <Site>C702</Site>
    <Version>1.0</Version>

Мне нужно сделать эту таблицу. Это должно выглядеть так:

      Count Name
----- ----
  97 200
 278 202
   2 205
  18 275

У меня есть этот код:

      $files = Get-ChildItem -Path "C:\Users\krivosik\Desktop\Scripts\logs\PosybeRestEPService\*.log"
#Write-Host $files
$files | 
    Select-String -Pattern 'ms 2','ms 4' | 
    Group-Object Pattern -NoElement
    #| Select-Object Count, Name 
    
    foreach ($file in $files){
$mss=$file | Select-String -Pattern 'ms 2','ms 4'
    foreach ($l in $mss){
        $s = $l -split(" ")
        $s[9]
        $s[9] | Group-Object | Select-Object Count, Name 
        #Group-Object Pattern -NoElement |
        #Select-String -Pattern 'ms 2','ms 4'
    } 
}

Я попытался разделить строку, и теперь у меня есть только те числа, которые я хочу. Теперь мне нужно их посчитать и составить эту таблицу, но я не знаю, как это сделать. Я должен использовать групповой объект, но он просто не работает для меня. Это единственный вывод, который я могу получить из этого кода:

      Count Name                     
----- ----                     
 1463 ms 2                     
    1 ms 4                     
202

Count : 1
Name  : 202

202

Count : 1
Name  : 202

202

Count : 1
Name  : 202

202

Count : 1
Name  : 202

1 ответ

является правильным решением в этом случае. Вам просто нужно сгруппировать по значению, которое было сопоставлено для имени, таким образом, оно учитывает общее количество найденных с этим шаблоном:

      Select-String -Path 'C:\Users\krivosik\Desktop\Scripts\logs\PosybeRestEPService\*.log' -Pattern '(?<=\d.*?ms )(2|4|5)\d+' | 
    Group-Object -Property { $_.Matches.Value } -NoElement

Что касается сопоставления с образцом, используйте " положительный взгляд назад ", чтобы обеспечить захват того, что будет свойством имени , что сделает его менее подверженным ошибкам в случае совпадения чего-то еще в строке.ms 2/4/5.

  • Позитивный взгляд сзади :(?<=\d.*?ms ), гарантирует совпадение этого шаблона, прежде чем вы сможете сопоставить то, что следует, без фактического захвата этого совпадения.
  • (2|4|5)\d+, вот фактический захват свойства имени с параметрами для соответствия шаблону, начинающемуся либо с2,4, или5только.

Сейчас,Group-Objectможет взять выходные данные и сгруппировать их по значениям, согласованным черезMatches.Value; то есть2xx,4xx,5xx.

Изменить : путь, по которому находятся эти значения, уже открыт черезSelect-Stringно вы должны вывести его с помощью вычисляемого свойства . Кроме того, если вы хотите сопоставить точные значения ms 2xx, регулярное выражение, следующее за положительным просмотром назад , должно быть изменено на эти значения:

      Select-String -Path 'C:\Users\krivosik\Desktop\Scripts\logs\PosybeRestEPService\*.log' -Pattern '(?<=\d.*?ms )(200|202)' | 
    Group-Object -Property { $_.Matches.Value } | 
        Select-Object -Property Count, Name, @{
            Name = 'Path'
            Expression = { $_.Group[0].Path }
        }
  • Используется в качестве разделителя для оператора RegEx " или ", поэтому он будет соответствовать точно 200 или 202.

Если вы хотите добавить больше значений для точного соответствия, просто разделите их|разделитель внутри().

Другие вопросы по тегам