![]() |
Обработка текстового лога
Здравствуйте.
Есть потребность в обработчике текстовых лог-файлов вида 1_Errors.log, 2_Errors.log и т.д.. В файлах записи такого рода: ------------------------------------------------------------------------------- 11.05.2011 15:21:39 : ERROR_FILE_NOT_FOUND ------------------------------------------------------------------------------- 11.05.2011 15:21:39 : Не найден файл D:\Backgrounds\low_Regbi2_3_00_10.05.11_SportReportTV.mpg ------------------------------------------------------------------------------- 11.05.2011 16:10:05 : Тайм-аут канала запроса во время ожидания ответа после истечения 00:00:03.7968750. Увеличьте значение времени тайм-аута, передаваемое вызову при Request или увеличьте значение SendTimeout в Binding. Время, назначенное для выполнения этой операции, может быть составной частью более длинного тайм-аута. ------------------------------------------------------------------------------- 11.05.2011 16:10:19 : Тайм-аут канала запроса при попытке отправить после истечения 00:00:04. Увеличьте значение времени тайм-аута, передаваемое вызову при Request или увеличьте значение SendTimeout в Binding. Время, назначенное для выполнения этой операции, может быть составной частью более длинного тайм-аута. ------------------------------------------------------------------------------- 11.05.2011 15:55:17 : Не удалось подключиться к http://***/***.WCFService/Service.svc. Код ошибки TCP 10065: Сделана попытка выполнить операцию на сокете для недоступного хоста ***. ------------------------------------------------------------------------------- 24.05.2011 01:34:27 : Не удалось подключиться к http://***/***.WCFService/Service.svc. Код ошибки TCP 10065: Сделана попытка выполнить операцию на сокете для недоступного хоста ***. Интересует выбор последних по дате(наиболее новых) записей, удаление остальных, после этого удаление всех строк, кроме строк вида 11.05.2011 15:21:39 : Не найден файл D:\Backgrounds\low_Regbi2_3_00_10.05.11_SportReportTV.mpg После удалить во всех строках все символы от начала строки до D:\ . Результатом должен быть текстовый файл, в котором в каждой строке будет запись вида D:\Backgrounds\low_Regbi2_3_00_10.05.11_SportReportTV.mpg По аналогии с http://forum.oszone.net/thread-187189-2.html не получилось.(не получается правильно задать переменную вроде бы) Если делать так: type *.log | findstr /i /o "mpg" > temp1.txt получатся что-то похожее: 443:11.05.2011 15:21:39 : Не найден файл D:\Backgrounds\low_Regbi2_3_00_10.05.11_SportReportTV.mpg, но не знаю как отсортировать последние и отделить путь D:\Backgrounds\* от мусора. |
GOLDLION, фильтровать логичней по тексту искомой ошибки,
только надо следить, чтобы кодировка текста в логах и батнике была одинаковой. Код:
@Echo Off |
amel27, спасибо!!! Работает именно так, как нужно.
Не сочтите за наглость, просто не совсем понимаю, как батник работает. Цитата:
Цитата:
Цитата:
в нем ищется текст, заданный переменной TXT, и все записи, содержащие этот текст помещаются в текстовый файл temp1.txt. Далее не могу понять, как именно работает конструкция For c с вложенной For. Т.е. имеено та самая "очистка от мусора". |
Цитата:
Цитата:
Цитата:
Код:
For /F "UseBackQ" %%a In ("temp1.txt") Do Set "KEY=%%a" P.S. кстати, тут нет вложенных FOR |
Теперь понятней, но повторить в другой задаче скорее всего не смогу :(
Разве что какую-то часть. А как правильно назвать вот то предварительное сохранение в $b? DIR/B/OD сортирует все *.log и результатом будут только имена файлов(/В) начиная со старых(/OD). Это делается, для того, чтобы получился список с отсортированными строками, в которых найдено совпадение с "%TXT%", и именно последняя была самой новой? Без Цитата:
И еще: если бы нужно было заменить не все что слева, а все что справа, как бы выглядела подстановка Цитата:
|
Цитата:
Цитата:
Цитата:
Цитата:
|
... при обработке могут дублироваться строки, причем идентичны они только в temp2.txt
Как удалить дублирующиеся строки с выводом уникальных в temp3.txt? Нашел такую конструкцию setlocal cd.>1.tmp set /p str=<1.txt :loop 1>>1.tmp (echo %str%) for /f "tokens=*" %%i in ('findstr /v /g:1.tmp 1.txt') do set "str=%%i" && goto:loop move 1.tmp 1.txt , но не полу но, это не работает. Тут http://forum.oszone.net/thread-187668.html показано как, но... опять же не понимаю как работает :( И там же по маске, а тут именно дублирующиеся. Кстати, можно ли в файле temp2.txt в виде комментария подписывать из какого именно *_Errors.log вытянута строка или блок строк? |
Цитата:
1. Формат файла шаблона отличается от обычного текста - например, символ "\" должен экранироваться в шаблоне "\\". 2. FINDSTR не работает с длинными шаблонами, выдавая ошибки на превышение длины или нехватку памяти. 3. Вложенный цикл будет очень медленным для больших файлов. п.1 можно учесть в батнике (1.txt -> 2.txt): альтернативный вариант - предварительная сортировка с обычным циклом: Цитата:
|
В общем случае, вся эта обработка нужна для того, чтобы определить, какие файлы не скопировались с фтп из-за отсутствия интернета на объекте и скопировать их вручную с флешки. Файлы в основном по 160-200 Мб/шт, и если на 14 ПК не хватает 1-5 файлов, а на одном, например, 30, то сливать на каждом объекте по 6 гиг будет относительно долго, а этот один визуально сразу будет видно(первый символ файлов Errors - это код объекта) и можно сэкономить время.
Если делать вывод в temp2 без удаления дублирующихся, но делать комментарии из какого лога вытянуто, то получится отчет пообъектно. Если потом в temp2 удалить дублирующиеся(коментарии тут уже не нужны)строки, то выйдет сводный отчет, который выводится в temp3. |
Код:
@Echo Off |
Рэспект! То,что нужно.
|
Время: 17:54. |
Время: 17:54.
© OSzone.net 2001-