как подсчитать разделенные слова шаблона 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.
Если вы хотите добавить больше значений для точного соответствия, просто разделите их|
разделитель внутри()
.