![]() |
Удаление строк из txt файлов
День добрый, помогите решить одну задачку..
в поиске что то не смог найти что нужно ( в общем есть папка Logs, внутри каждый день создается папка с нов датой, и каждый день пишутся файлы в формате txt с датой в названии, суть логов сводится к тому что 99% строк занимает [2000001] дата время files not found [2000095] дата время files not found и иногда проскакивает в лог что файл отправлен [2000156] дата время file 80009547.dat has been sent ну бывает конечно и таое что файл слишком большой допустим [2000042] дата время error file size ну что то примерно такое.. эти команды пишутся каждые 5 секунд, и за день собирается столько мусора что потом блокнот их открывает приличное время.. так собственно задачка, хочу сделать bat, чтобы искал за предыдущий день логи и удалял оттуда строки содержащие "files not found", а строки с ошибками и успешными отправками оставлял крайне желательно чтоб это было возможно запихать в планировщик задач и чтоб он это делал на постоянной основе |
Опишите подробнее строение каталога Logs.
А саму программу, которая пишет логи, нельзя подкрутить, чтобы она не писала в лог, если файлов нет? |
Цитата:
D:\logs\20221002\кучацифр.txt D:\logs\20221003\кучацифр.txt файлов в каждой папке обычно 2-3шт ну и естественно, сегодня D:\logs\20221003\кучацифр.txt этот файл недоступен тк пишется лог программу подкрутить нельзя ( |
|
Цитата:
Цитата:
Исходные файлы должны быть неизменными (их удалять не надо?)? Надо ли слить все данные в единственный файл или количество целевых файлов должно соответствовать количеству исходных? Кодировка файлов имеет значение? |
Powershell:
Код:
(dir D:\logs -File -Recurse -Include "*.txt" |? {($_.LastWriteTime).date -eq (get-date).AddDays(-1).Date}).FullName |% { |
Цитата:
Цитата:
можно и в 1 файл, без разницы кодировка в итоге значения не имеет |
|
Цитата:
Инструменты не требуют ни любви, ни ненависти, ими просто надо учиться пользоваться... а если лень, то придется отверстия, например, выдалбливать молотком и пробойником, вместо дрели... Цитата:
Вот скрипт powershell, с помощью которого, Вы можете это сделать интуитивно (снабжен комментариями): Код:
# Путь к каталогу: |
Код:
@Echo Off Если исходные файлы оставим без изменений. Получаем суммарный файл. Код:
@Echo Off |
|
John87,
Цитата:
Вопросы: 1. Папка D:\test1 существует? 2. В папке D:\test1 должны быть как минимум 2 подпапки: сегодняшняя и за предыдущий день. Скрипт не привязан к дате. Он пропускает самую свежую папку (по времени создания) и обрабатывает одну предыдущую. 3. В подпапках есть файлы с указанной маской *.txt? Если что-то из перечисленного отсутствует, то будет приведенная Вами картинка. Кстати, если разово убрать GoTo :End то будут обработаны все подпапки, кроме самой свежей. Но именно разово - все папки обрабатывать - лишнее время. |
megaloman, совсем забыл в тестовой папке создать еще одну. Спасибо, вроде работает!
теперь вопрос, он собирает нужное, кидает в нов файл, старые файлы он может удалить? |
John87, старые файлы он может удалить.
Код:
@Echo Off |
Вложений: 1
megaloman, начал пробовать на живом примере и меня постигла неудача ((
оказывается это не одна строка (( в итоге получил кучу остатков " затрачено 1.163 (sec.)" |
John87, Дайте реальный файл и что надо удалять. Догадками задачу не решить. CMD команда, способная делать множественный поиск - FindStr - работает с поиском строк в кириллице только в 866 кодировке. С учетом этого вариант (там я привёл только варианты поиска с латиницей):
Код:
@Echo Off |
Цитата:
на первое время удаление я исключу из формулы, пусть лежат оригиналы. насколько сложно его научить обращаться с кирилицей в keyword? я немного запутался, такой вопрос, куда дописать чтобы итог выполнения был сложен в отд папку? те допустим чтоб он складывал также по папкам с датой но уже в Z:\ShortLogs допустим? |
Код:
@Echo Off И лучше бы Вы предоставили 1 файл для тестирования |
Вложений: 1
Цитата:
в прошлый раз закинул, на форуме ограничение на размеры ( |
powershell
Код:
$log = (gc "C:\temp\BG.API.MessagingSystem.log" -raw) -replace "`n`t","`t" -split "`n" |
John87, На Вашем примере вроде бы отрабатывает. Я попробовал отсечь цифровую подпись - вывожу в файл только строки, содержащие : (двоеточие)
Код:
Set KeyWord=^|find /I ":"^|find /V /I "files not found"^|find /V /I "Обработано.записей"^|find /V /I "error file size" Код:
Set KeyWord=^|find /I "#"^|find /V /I "files not found"^|find /V /I "Обработано.записей"^|find /V /I "error file size" |
megaloman, в принципе меня устраивает, как работает вариант
Код:
cls в этом синтаксисе можно эти строки оставить но отменить? решеткой или еще как? чтоб файл был готов, и требовал минимальных изменений, а то забуду ведь ( кстати если я добавляю их в нынешний вариант, он ничего не удаляет и делает только один самый старый лог ( |
Время: 05:37. |
Время: 05:37.
© OSzone.net 2001-