2015-12-01 2 views
0

У меня есть файл журнала robocopy, с которым я работаю, и мне нужно извлечь сводные строки с помощью powershell. Проблема, с которой я сталкиваюсь, заключается в том, что резюме не всегда одинаковой длины в количестве строк.Powershell получает строки из текстового файла после последнего вхождения строки

Предполагая, что файл журнала выглядит следующим образом:

------------------------------------------------------------------------------- 
    ROBOCOPY  ::  Robust File Copy for Windows        
------------------------------------------------------------------------------- 

    Started : Tue Dec 01 06:55:11 2015 

    Source : C:\Source Path 
    Dest : E:\Destination Path 

    Files : *.* 

    Options : *.* /TEE /S /E /COPY:DAT /PURGE /MIR /NP /R:2 /W:2 

------------------------------------------------------------------------------ 
List of files here 
List of files here 
List of files here 
------------------------------------------------------------------------------ 
       Total Copied Skipped Mismatch FAILED Extras 
    Dirs :  945   0  945   0   0   0 
    Files :  10118   4  10114   0   0   3 
    Bytes : 1.245 g 323.9 k 1.244 g   0   0   0 
    Times : 0:00:17 0:00:00      0:00:00 0:00:17 

    Speed :    5264920 Bytes/sec. 
    Speed :    301.261 MegaBytes/min. 

    Ended : Tue Dec 01 06:55:28 2015 

Я могу статически получить последние 11 строк файла с помощью команды $summary = Get-Content $log | Select-Object -last 11 | Out-String, но эти две скорости линии перечислены только если данные фактически перемещены, которые в противном случае получается последняя строка в списке файлов. В конечном счете, это не огромная проблема, но это выглядит не очень красиво.

Вместо заданного количества строк, как я могу получить последние строки из файла, после последнего (или четвертого, всегда есть 4) появления разделителя ---------------?

ответ

0

Я выяснил решение, но я чувствую, что должен быть лучший способ. Первая команда находит все разделители и выводит номера строк в массив $finds, затем вторую строку, используя последний элемент в массиве $finds в качестве отправной точки для извлечения резюме.

Надеюсь, это поможет кому-то еще!

$finds = Get-Content $log | Select-string "--------------" | Select-Object LineNumber 

$summary = Get-Content $log | Select-Object -skip $finds[-1]."LineNumber" | Out-String 
0
Get-Content $log | Select-String 'Total' -Context 0,20 

Объяснение: Select-STring ищет любую строку, содержащую 'Total'. Параметр -Context 0,20 сообщает ему отображать до 20 строк после соответствующей строки (и нулевые строки до).

Если вы скопируете такой файл, как 'sales_total.txt', эта строка также будет соответствовать. Чтобы этого избежать, вы можете сделать строку соответствия более явной. Например, используйте полную строку.

+0

Единственный минус, который я вижу здесь параметр контекста будет добавлять пустые строки после EOF, чтобы сделать его 20 строк. Я уже пробовал нечто подобное, но в зависимости от ситуации это сработает. Я немного придирчив к моему форматированию для этого проекта. – Butters

+0

Нет, он не добавляет пустые строки. – Swonkie

0

Попробуйте это:

Get-Content $log -Delimiter ('-'*78) | 
Select -last 1 
Смежные вопросы