Подсчитать вхождение строк в лог-файл с помощью PowerShell - PullRequest
0 голосов
/ 24 мая 2018

Мне нужно получить возникновение «сбоя» в лог-файле.Дело в том, что мне нужно получить возникновение "сбоя" для каждого блока сеанса.Как выглядит журнал:

---Session 1 
check 
check 
failure
failure 
check
----Session 2 
check 
failure 
check 
check 
----Session 3 
failure 
failure

То, что я получил до сих пор, таково:

$rows = Get-Childitem -Path E:\shell\lot.log  |
        Select-String -Pattern failure
$i = 0
foreach ($row in $rows) {
    $i++
}
echo $i

С этим сценарием я получаю только общее количество вхождений.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Я начинаю новый счетчик всякий раз, когда встречается строка, начинающаяся с 3 или более последовательных дефисов, и собираю результаты в хеш-таблицу.

$failcount = @{}

Get-Content 'E:\shell\lot.log' | ForEach-Object {
    if ($_ -match '^-{3,}(.*)') {
        $section = $matches[1].Trim()
        $failcount[$section] = 0
    } elseif ($_ -like '*failure*') {
        $failcount[$section]++
    }
}
0 голосов
/ 24 мая 2018

Я добавлю еще один вариант.Прочитайте весь файл журнала с -Raw, чтобы получить многострочную строку.Удалите ---- из первой строки, а затем разделите на 3 или более дефиса в начале строки, это даст вам каждый сеанс в виде многострочной строки, затем вы можете просто вывести текст или пользовательские объекты, или что угодноты хотел с этим.Разбейте многострочную строку на символы новой строки, отфильтруйте по «сбоям» и сделайте подсчет, чтобы получить сбои за сеанс.

(GC E:\shell\lot.log -Raw) -replace '^-+' -split '(?<=[\r\n])---+'|%{
    '{0} had {1} failure(s)' -f ($_.split("`n")[0].Trim()),($_ -split '[\r\n]+'|?{$_ -match 'failure'}).Count
}

Это даст (с учетом предоставленного образца) вывод:

Session 1 had 2 failure(s)
Session 2 had 1 failure(s)
Session 3 had 2 failure(s)
0 голосов
/ 24 мая 2018

Я верю, что это сделает это.Ключевым моментом является сброс счетчика после каждого сеанса.

$rows = Get-Childitem -Path E:\shell\lot.log

$i = 0  # failure counter
$j = 1  # session counter

foreach($row in $rows){
    if($row -like "*Session 1"){
        # skip the first line. Edit: removed * as would skip session 10, 11 etc. assumes line ends with "session 1"
        continue
    }elseif($row -eq "failure){
        # if the row is equal to failure, count it
        $i++
    }elseif($row -like "*Session*"){
        # when you get to the end of a session, print the number of failures
        Write-Host "Session $j had $i failures"

        # ... and reset the failure counter 
        $i = 0

        # increment the session counter
        $j++
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...