|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Обработка текстового лога |
|
|
CMD/BAT - [решено] Обработка текстового лога
|
Новый участник Сообщения: 13 |
Здравствуйте.
Есть потребность в обработчике текстовых лог-файлов вида 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\* от мусора. |
|
Отправлено: 20:57, 25-05-2011 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать GOLDLION, фильтровать логичней по тексту искомой ошибки,
только надо следить, чтобы кодировка текста в логах и батнике была одинаковой. @Echo Off SetLocal EnableDelayedExpansion ::----------------------- Set "TXT=Не найден файл " ::----------------------- Type Nul >temp1.txt For /F %%d In ('DIR/B/OD *.log') Do Find "%TXT%"<"%%d">>temp1.txt For /F "UseBackQ" %%a In ("temp1.txt") Do Set "KEY=%%a" (For /F "UseBackQ Tokens=1*" %%a In ("temp1.txt") Do (Set "$b=%%b" If "%%a"=="%KEY%" Echo !$b:*%TXT%=! ))>temp2.txt |
Отправлено: 05:14, 26-05-2011 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать amel27, спасибо!!! Работает именно так, как нужно.
Не сочтите за наглость, просто не совсем понимаю, как батник работает. Цитата amel27:
Цитата amel27:
Цитата amel27:
в нем ищется текст, заданный переменной TXT, и все записи, содержащие этот текст помещаются в текстовый файл temp1.txt. Далее не могу понять, как именно работает конструкция For c с вложенной For. Т.е. имеено та самая "очистка от мусора". |
|||
Отправлено: 11:40, 30-05-2011 | #3 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата GOLDLION:
Цитата GOLDLION:
Цитата GOLDLION:
Осталось построчно прочитать файл, отобрать строки с датой =="%KEY%" и сохранить их в другом файле, но уже без левой ненужной части, это и делает последний цикл. %%a равно дате (первый токен), %%b - вся остальная часть строки, которую предварительно сохраняем в переменную $b, а подстановка !$b:*%TXT%=! заменяет в переменной $b "%TXT%" и всё что слева на пустую строку (т.е. удаляет). P.S. кстати, тут нет вложенных FOR |
|||
Отправлено: 13:05, 30-05-2011 | #4 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать Теперь понятней, но повторить в другой задаче скорее всего не смогу
![]() Разве что какую-то часть. А как правильно назвать вот то предварительное сохранение в $b? DIR/B/OD сортирует все *.log и результатом будут только имена файлов(/В) начиная со старых(/OD). Это делается, для того, чтобы получился список с отсортированными строками, в которых найдено совпадение с "%TXT%", и именно последняя была самой новой? Без Цитата amel27:
И еще: если бы нужно было заменить не все что слева, а все что справа, как бы выглядела подстановка Цитата amel27:
|
|||
Отправлено: 18:40, 30-05-2011 | #5 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата GOLDLION:
Цитата GOLDLION:
![]() Цитата GOLDLION:
Цитата GOLDLION:
|
||||
Отправлено: 08:43, 31-05-2011 | #6 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать ... при обработке могут дублироваться строки, причем идентичны они только в 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 вытянута строка или блок строк? |
Отправлено: 19:29, 01-06-2011 | #7 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать Цитата GOLDLION:
1. Формат файла шаблона отличается от обычного текста - например, символ "\" должен экранироваться в шаблоне "\\". 2. FINDSTR не работает с длинными шаблонами, выдавая ошибки на превышение длины или нехватку памяти. 3. Вложенный цикл будет очень медленным для больших файлов. п.1 можно учесть в батнике (1.txt -> 2.txt): альтернативный вариант - предварительная сортировка с обычным циклом: Цитата GOLDLION:
|
||
Отправлено: 08:43, 02-06-2011 | #8 |
Новый участник Сообщения: 13
|
Профиль | Отправить PM | Цитировать В общем случае, вся эта обработка нужна для того, чтобы определить, какие файлы не скопировались с фтп из-за отсутствия интернета на объекте и скопировать их вручную с флешки. Файлы в основном по 160-200 Мб/шт, и если на 14 ПК не хватает 1-5 файлов, а на одном, например, 30, то сливать на каждом объекте по 6 гиг будет относительно долго, а этот один визуально сразу будет видно(первый символ файлов Errors - это код объекта) и можно сэкономить время.
Если делать вывод в temp2 без удаления дублирующихся, но делать комментарии из какого лога вытянуто, то получится отчет пообъектно. Если потом в temp2 удалить дублирующиеся(коментарии тут уже не нужны)строки, то выйдет сводный отчет, который выводится в temp3. |
Отправлено: 13:04, 02-06-2011 | #9 |
Googler Сообщения: 3665
|
Профиль | Отправить PM | Цитировать @Echo Off SetLocal EnableDelayedExpansion ::----------------------- Set "TXT=Не найден файл " ::----------------------- Set/A "ln=0,li=0" (For /F "Delims=" %%a In ('DIR/B/OD *.log') Do ( For /F "Tokens=1*" %%b In ('Find "%TXT%"^<"%%a"') Do ( If Not "%%b"=="!$b!" Set "ln=!li!"& Set "$b=%%b" Set "$c=%%c"& Set/A li+=2 Echo ;%%a Echo !$c:*%TXT%=! )))>temp1.txt More +%ln% temp1.txt >temp2.txt Sort /L "C" "temp2.txt" /O "temp2.tmp" (For /F "UseBackQ Delims=" %%a In ("temp2.tmp") Do ( If /I Not "%%a"=="!$a!" Echo %%a Set "$a=%%a" ))>"temp3.txt" |
Отправлено: 14:20, 02-06-2011 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Разбор лога со справочником | zlidnevan | Программирование в *nix | 0 | 05-05-2010 23:14 | |
MSFT SQL Server - результаты запроса в виде текстового файла и его обработка | minusodin | Программирование и базы данных | 7 | 30-03-2010 15:48 | |
Получение и обработка информации из текстового файла | ya158 | AutoIt | 3 | 11-09-2009 01:24 | |
Настройка вида лога sendmail | fox_12 | Программное обеспечение Linux и FreeBSD | 0 | 08-10-2007 16:56 | |
Сохранение лога разговора | user_not_found | Хочу все знать | 2 | 27-01-2007 17:33 |
|