Войти

Показать полную графическую версию : Удаление строк из txt файлов


Страниц : [1] 2

John87
30-09-2022, 11:05
День добрый, помогите решить одну задачку..
в поиске что то не смог найти что нужно (

в общем есть папка 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", а строки с ошибками и успешными отправками оставлял

крайне желательно чтоб это было возможно запихать в планировщик задач и чтоб он это делал на постоянной основе

DJ Mogarych
30-09-2022, 14:40
Опишите подробнее строение каталога Logs.

А саму программу, которая пишет логи, нельзя подкрутить, чтобы она не писала в лог, если файлов нет?

John87
03-10-2022, 08:23
Опишите подробнее строение каталога Logs.
А саму программу, которая пишет логи, нельзя подкрутить, чтобы она не писала в лог, если файлов нет? »
D:\logs\20221001\кучацифр.txt
D:\logs\20221002\кучацифр.txt
D:\logs\20221003\кучацифр.txt
файлов в каждой папке обычно 2-3шт

ну и естественно, сегодня D:\logs\20221003\кучацифр.txt этот файл недоступен тк пишется лог

программу подкрутить нельзя (

BoBaH 13
03-10-2022, 10:18
Замена текста в файле скриптом JScript (https://nhutils.ru/blog/zamena-teksta-v-fajle-iz-komandnoj-stroki/)

YuS_2
03-10-2022, 10:38
за день собирается столько мусора что потом блокнот их открывает приличное время.. »
Насколько большой получается файл за сутки... максимально?
файлов в каждой папке обычно 2-3шт »
От чего зависит наличие файлов больше одного?
Исходные файлы должны быть неизменными (их удалять не надо?)?
Надо ли слить все данные в единственный файл или количество целевых файлов должно соответствовать количеству исходных?
Кодировка файлов имеет значение?

DJ Mogarych
03-10-2022, 13:04
Powershell:

(dir D:\logs -File -Recurse -Include "*.txt" |? {($_.LastWriteTime).date -eq (get-date).AddDays(-1).Date}).FullName |% {
$log = (gc $_) -notmatch 'files not found'
$log |Set-Content $_
}

John87
04-10-2022, 08:24
Насколько большой получается файл за сутки.. »
около 5мб

От чего зависит наличие файлов больше одного?
Исходные файлы должны быть неизменными (их удалять не надо?)?
Надо ли слить все данные в единственный файл или количество целевых файлов должно соответствовать количеству исходных?
Кодировка файлов имеет значение? »
исходные файлы я как раз хочу прохудить немного и избавить от мусора!
можно и в 1 файл, без разницы
кодировка в итоге значения не имеет

John87
04-10-2022, 08:55
Powershell »
ненавижу если честно ps..

з.ы. что то не работает (
https://i.ibb.co/nfP0jj4/eror.jpg (https://ibb.co/nfP0jj4)

YuS_2
04-10-2022, 10:06
ненавижу если честно ps.. »
Звучит как: "да нафига мне ваши автомобили, я и на велосипеде неплохо передвигаюсь..." :)
Инструменты не требуют ни любви, ни ненависти, ими просто надо учиться пользоваться... а если лень, то придется отверстия, например, выдалбливать молотком и пробойником, вместо дрели...
что то не работает ( »
В общем, скрипт надо корректировать под себя, т.е. указать правильный путь к каталогу, как минимум.

Вот скрипт powershell, с помощью которого, Вы можете это сделать интуитивно (снабжен комментариями):
# Путь к каталогу:
$fldsrc = 'D:\LOGS'
# Получение наименования каталога по дате, меньшей текущей на 1 день:
$fldin = get-date((get-date).adddays(-1)) -f 'yyyyMMdd'
# Общий путь к каталогу с предыдущей датой:
$fld = $fldsrc + '\' + $fldin
# Фильтр для отбора файлов логов:
$flt = '*.txt'
# Шаблон для отбора строк на удаление
$pattern = 'files not found'
# Кодировка:
$enc = 'utf8'
# Наименование с путем целевого файла:
$out = $fld + '\' + $fldin + '.out'

# Собственно, код обработки:
dir $fld -filter $flt -file|%{
(sls -path $_.fullname -pattern $pattern -notm -all -enc $enc).line
del $_.fullname
}|out-file $out -enc $enc
- здесь использованы пути, которые Вы указали ранее, но их можно корректировать...

megaloman
04-10-2022, 20:30
@Echo Off
cls
Set "BoxIn=Z:\Logs"
Set "Log=*.txt"
Set "KeyWord=files not found"

FOR /F "usebackq skip=1 delims=" %%d IN (`2^>nul Dir "%BoxIn%" /A:D /O:-D /T:C /B`) DO (
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%d\%Log%" /A:-D /B`) DO (
2>nul >"%BoxIn%\%%d\%%f.tmp" (More "%BoxIn%\%%d\%%f"|Find /I /V "%KeyWord%")
>nul Move /Y "%BoxIn%\%%d\%%f.tmp" "%BoxIn%\%%d\%%f"
)
GoTo :End
)
:End
pause
Exit /B
Путь укажИте свой
Если исходные файлы оставим без изменений. Получаем суммарный файл.@Echo Off
cls
Set "BoxIn=Z:\Logs"
Set "Log=*.txt"
Set "KeyWord=files not found"

FOR /F "usebackq skip=1 delims=" %%d IN (`2^>nul Dir "%BoxIn%" /A:D /O:-D /T:C /B`) DO (
cd.>"%BoxIn%\%%d\%%d.txt"
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%d\%Log%" /A:-D /B /O:D /T:C`) DO (
2>nul >>"%BoxIn%\%%d\%%d.txt" (More "%BoxIn%\%%d\%%f"|Find /I /V "%KeyWord%")
)
GoTo :End
)
:End
pause
Exit /B

John87
05-10-2022, 10:39
megaloman, толе лыжи не едут, то ле руки у мну не очень ((
BoxIn=D:\test1
KeyWord=no files to

https://i.ibb.co/nPPf7xQ/Untitled-1.jpg (https://ibb.co/nPPf7xQ)

megaloman
05-10-2022, 13:22
John87, есть папка Logs, внутри каждый день создается папка с нов датой ......сделать bat, чтобы искал за предыдущий день логи и удалял оттуда строки »
Я попробовал повторить ситуацию.
Вопросы:
1. Папка D:\test1 существует?
2. В папке D:\test1 должны быть как минимум 2 подпапки: сегодняшняя и за предыдущий день. Скрипт не привязан к дате. Он пропускает самую свежую папку (по времени создания) и обрабатывает одну предыдущую.
3. В подпапках есть файлы с указанной маской *.txt?

Если что-то из перечисленного отсутствует, то будет приведенная Вами картинка.
Кстати, если разово убрать GoTo :End то будут обработаны все подпапки, кроме самой свежей.
Но именно разово - все папки обрабатывать - лишнее время.

John87
06-10-2022, 08:21
megaloman, совсем забыл в тестовой папке создать еще одну. Спасибо, вроде работает!
теперь вопрос, он собирает нужное, кидает в нов файл, старые файлы он может удалить?

megaloman
06-10-2022, 10:00
John87, старые файлы он может удалить. @Echo Off
cls
Set "BoxIn=Z:\Logs"
Set "Log=*.txt"
Set "KeyWord=files not found"

FOR /F "usebackq skip=1 delims=" %%d IN (`2^>nul Dir "%BoxIn%" /A:D /O:-D /T:C /B`) DO (
Echo "%BoxIn%\%%d\%%d"
If Not Exist "%BoxIn%\%%d\%%d.txt" (
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%d\%Log%" /A:-D /B /O:D /T:C`) DO (
2>nul >>"%BoxIn%\%%d\%%d.txt" (More "%BoxIn%\%%d\%%f"|Find /I /V "%KeyWord%")
Del "%BoxIn%\%%d\%%f"
)
)
GoTo :End
)
:End
pause
Exit /B
При наличии в подпапке суммарного файла повторно эта подпапка обрабатываться не будет. Учтите это, если от старого тестирования этот файл остался.

John87
07-10-2022, 13:34
megaloman, начал пробовать на живом примере и меня постигла неудача ((

оказывается это не одна строка (( в итоге получил кучу остатков " затрачено 1.163 (sec.)"

megaloman
08-10-2022, 13:14
John87, Дайте реальный файл и что надо удалять. Догадками задачу не решить. CMD команда, способная делать множественный поиск - FindStr - работает с поиском строк в кириллице только в 866 кодировке. С учетом этого вариант (там я привёл только варианты поиска с латиницей):@Echo Off
cls
Set "BoxIn=Z:\Logs"
Set "Log=*.txt"
Set KeyWord=/C:"files not found" /C:"(sec.)" /C:"#imp.Statuses" /C:"error file size"

FOR /F "usebackq skip=1 delims=" %%d IN (`2^>nul Dir "%BoxIn%" /A:D /O:-D /T:C /B`) DO (
Echo "%BoxIn%\%%d\%%d"
If Not Exist "%BoxIn%\%%d\%%d.txt" (
FOR /F "usebackq delims=" %%f IN (`2^>nul Dir "%BoxIn%\%%d\%Log%" /A:-D /B /O:D /T:C`) DO (
2>nul >>"%BoxIn%\%%d\%%d.txt" (More "%BoxIn%\%%d\%%f"|FindStr /I /V %KeyWord%)
Del "%BoxIn%\%%d\%%f"
)
)
GoTo :End
)
:End
pause
Exit /B
А не проще ли переформулировать задачу: надо не удалять какие-то строки из исходных файлов, а сохранить некоторые строки в другой файл по заданным ключам поиска, если они в латинице?

John87
11-10-2022, 13:01
А не проще ли переформулировать задачу: надо не удалять какие-то строки из исходных файлов, а сохранить некоторые строки в другой файл по заданным ключам поиска, если они в латинице? »
к сожалению там очень много что он умеет писать, посему проще избавиться от мусора!
на первое время удаление я исключу из формулы, пусть лежат оригиналы.

насколько сложно его научить обращаться с кирилицей в keyword?

я немного запутался, такой вопрос, куда дописать чтобы итог выполнения был сложен в отд папку?
те допустим чтоб он складывал также по папкам с датой но уже в Z:\ShortLogs допустим?

megaloman
11-10-2022, 22:45
@Echo Off
cls
>nul chcp 1251
Set "BoxIn=Z:\Logs"
Set "Log=*.txt"
Set "ShortLogs=Z:\ShortLogs"

Set KeyWord=^|find /V /I "files not found"^|find /V /I "Обработано.записей"^|find /V /I "затрачено"^|find /V /I "error file size"

If Not Exist "%ShortLogs%\*.*" Md "%ShortLogs%"

FOR /F "usebackq skip=1 delims=" %%d IN (`2^>nul Dir "%BoxIn%" /A:D /O:-D /T:C /B`) DO (
Echo "%BoxIn%\%%d\%%d"
If Not Exist "%ShortLogs%\%%d.txt" (
2>nul >>"%ShortLogs%\%%d.txt" (Type "%BoxIn%\%%d\%Log%"%KeyWord%)
)
GoTo :End
)
:End
pause
Exit /B
Батник сохранить в кодировке 1251 (например, блокнот NotePad)
И лучше бы Вы предоставили 1 файл для тестирования

John87
12-10-2022, 07:33
И лучше бы Вы предоставили 1 файл для тестирования »
не досмотрел (

в прошлый раз закинул, на форуме ограничение на размеры (

DJ Mogarych
12-10-2022, 10:25
powershell

$log = (gc "C:\temp\BG.API.MessagingSystem.log" -raw) -replace "`n`t","`t" -split "`n"
$log -notmatch 'Обработано.записей.статусов.отправленных.сообщений'




© OSzone.net 2001-2012