Один из способов сделать это - использовать RegEx, чтобы отделить каждую строку, а затем создать новый объект из деталей. Например:
Get-Content .\data.txt |
ForEach-Object {
if ($_ -match "^(?<time>(\d+\.){2}\d+ (\d{2}:){2}\d{2}).*(?<state>Starting|finished).*\b(?<keyword>\w+)$")
{
[PsCustomObject]@{
Keyword = $matches.keyword
Action = $(if($matches.state -eq "Starting"){"Start"}else{"Finish"})
Time = (Get-Date $matches.time)
}
}
}
Предположим, у вас есть файл журнала (data.txt
) со следующим содержимым:
18.7.2017 12:59:15 Starting thread: KEYWORD1
18.7.2017 13:32:19 Starting thread: KEYWORD2
18.7.2017 12:59:15 Starting thread: KEYWORD3
18.7.2017 13:34:18 Thread finished;... KEYWORD2
18.7.2017 12:59:15 Starting thread: KEYWORD4
18.7.2017 13:34:18 Thread finished;... KEYWORD3
18.7.2017 12:59:15 Starting thread: KEYWORD5
18.7.2017 13:34:18 Thread finished;... KEYWORD5
Запустив приведенный выше код, выдает:
Keyword Action Time
------- ------ ----
KEYWORD1 Start 18/07/2017 12:59:15
KEYWORD2 Start 18/07/2017 13:32:19
KEYWORD3 Start 18/07/2017 12:59:15
KEYWORD2 Finish 18/07/2017 13:34:18
KEYWORD4 Start 18/07/2017 12:59:15
KEYWORD3 Finish 18/07/2017 13:34:18
KEYWORD5 Start 18/07/2017 12:59:15
KEYWORD5 Finish 18/07/2017 13:34:18
Это не так уж и много лучше по сравнению с необработанным файлом, но теперь, когда у вас есть некоторые объекты, вы можете легче их обрабатывать. Например, вы можете увидеть, какие из них не имеют соответствующего начала / конца, добавив следующее после последней скобки:
| Group-Object Keyword -NoElement | Sort-Object Count -Descending
Это дает следующий вывод:
Count Name
----- ----
2 KEYWORD2
2 KEYWORD3
2 KEYWORD5
1 KEYWORD1
1 KEYWORD4
Теперь легче увидеть, у кого из них есть пара старт / финиш (например, в каждой группе по 2 предмета)
Вероятно, это немного излишне для вашего сценария, но, как вы сказали, вы были новичком в PowerShell, я подумал, что упомяну об этом, поскольку часто очень полезно превращать текст в подобный объект для обработки.