2015-03-10 2 views
0

У меня есть программа, которая запускает несколько утилит в ночное время. Эта утилита выводит каждое действие, которое оно принимает в тот же файл журнала каждую ночь. Журнал является кумулятивным, поэтому у меня есть тысячи строк для сортировки. Вот пример:Извлечение определенных частей файла журнала

10/15/2014 08:19:43 [Nightly Run] начался.
10/15/2014 08:19:44 Начало проверки заголовка в 8:19 утра 10/15/2014
10/15/2014 08:19:44 Невозможно прочитать заголовок - [Путь к файлу]
10/15/2014 08:19:46 End Header Check at 8:19 AM on 10/15/2014
10/15/2014 08:19:47 [Утилита 1] началась
10/15/2014 08:20: 14 [Утилита 1] завершена
15.10.2018 08:20:18 [Утилита 2] началась.
10/15/2014 08:20:18 [Утилита 2] закончилась.
10/15/2014 08:20:33 [Nightly Run] закончился.

проверка заголовка происходит по ночам, поэтому есть сотни строк, которые нужно пройти. Ошибка «невозможно прочитать заголовок» не возникает каждую ночь. Я пытаюсь вывести ночи, когда заголовок является ошибкой в ​​текстовом файле, в основном я хотел бы, чтобы мой вывод читался как

10/15/2014 08:19:44 Start Header Check to 8:19 AM on 10/15/2014
10/15/2014 08:19:44 Невозможно прочитать заголовок - [Путь к файлу]
10/15/2014 08:19:46 Конец заголовка Проверка в 8:19 утра 10/15/2014

за каждый раз, когда проверка заголовка запускается и ошибки на определенном [пути к файлу].

Моя мысль состоит в том, чтобы разбить текст на отдельные объекты на основе «Начальная проверка заголовка»/«Проверка конечного заголовка» и использовать строку выбора, чтобы захватить только объекты, содержащие «Невозможно прочитать заголовок - [Путь к файлу]», ,

Get-content X:\logfile.txt -delimiter "Start Header Check" | 
    Select-String -Pattern 'Unable to read header - [Filepath]' | 
    out-file X:\outfile.txt 

Который возвращает:

в 8:19 утра на 10/15/2014
10/15/2014 08:19:44 Невозможно прочитать заголовок - [Filepath]
10/15/2014 08:19:46 End Header Check at 8:19 AM on 10/15/2014
10/15/2014 08:19:47 [Утилита 1] началась
10/15/2014 08:20:14 [Утилита 1] завершена
15.10.2018 08:20:18 [Утилита 2] началась.
10/15/2014 08:20:18 [Утилита 2] закончилась.
10/15/2014 08:20:33 [Nightly Run] закончился.

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

Я действительно рассматривал использование -raw-переключателя для параметра -raw и использования .slipt(), но я уверен, что я лаял с ним неправильное дерево.

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

+0

Вы можете сделать: cat | grep «Невозможно прочитать заголовок» -A 1 -B 1. Вы можете добавить еще один канал с wc, чтобы получить количество строк, но вам нужно удалить A и B из grep примерно так: cat | grep «Невозможно прочитать заголовок» | wc -l –

+0

@FarhanRahman: Как вы это делаете с Powershell? Очень желательно читать теги перед отправкой на вопрос. :-) –

ответ

0

Я начал с использования Get-Content -Delimiter '[Nightly Run] закончился.

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

$regex = 
@' 
(?ms)[0-9/]+ [0-9:]+ Start Header Check at .+? 
.+? Unable to read header .+ 
.+? End Header Check .+? on [0-9/]+ 
'@ 

Get-content X:\logfile.txt -delimiter '[Nightly Run] ended.' | 
foreach { 
if ($_ -match $regex) 
    { $Matches[0] } 
} 

Edit: регулярное выражение с поправкой на возможность многоразового чтения неудач.

+0

Красивая, спасибо. Это было многострочное регулярное выражение, которое удерживало меня. Не использовали их со времен Everquest с ACT. –

+0

Бах, выстрелил себе в ногу, не объяснив, в основном, журнал в начальном посте. Существуют случаи, когда этот заголовок выходит из строя через несколько файлов. Что будет в регулярном выражении включать несколько строк? Постараюсь самостоятельно, но если вы чувствуете себя вдвойне полезными. :) 10/31/2014 07:15:42 Запуск проверки заголовка в 7:15 утра на 10/31/2014 31.10.2014 07:15:42 Невозможно прочитать заголовок - Файл 1 10/31/2014 07:15:42 Невозможно прочитать заголовок - Файл 2 31.10.2014 07:15:42 Невозможно прочитать заголовок - Файл 3 31.10.2014 07:15:44 Проверка конечного заголовка в 7:15 на 10/31/2014 –

+0

Мы можем справиться с этим. – mjolinor

Смежные вопросы