Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление строк из txt файлов (http://forum.oszone.net/showthread.php?t=352025)

John87 30-09-2022 11:05 2993310

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

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

DJ Mogarych 30-09-2022 14:40 2993322

Опишите подробнее строение каталога Logs.

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

John87 03-10-2022 08:23 2993505

Цитата:

Цитата DJ Mogarych
Опишите подробнее строение каталога 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 2993510

Замена текста в файле скриптом JScript

YuS_2 03-10-2022 10:38 2993511

Цитата:

Цитата John87
за день собирается столько мусора что потом блокнот их открывает приличное время.. »

Насколько большой получается файл за сутки... максимально?
Цитата:

Цитата John87
файлов в каждой папке обычно 2-3шт »

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

DJ Mogarych 03-10-2022 13:04 2993515

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 2993549

Цитата:

Цитата YuS_2
Насколько большой получается файл за сутки.. »

около 5мб

Цитата:

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

исходные файлы я как раз хочу прохудить немного и избавить от мусора!
можно и в 1 файл, без разницы
кодировка в итоге значения не имеет

John87 04-10-2022 08:55 2993553

Цитата:

Цитата DJ Mogarych
Powershell »

ненавижу если честно ps..

з.ы. что то не работает (

YuS_2 04-10-2022 10:06 2993559

Цитата:

Цитата John87
ненавижу если честно ps.. »

Звучит как: "да нафига мне ваши автомобили, я и на велосипеде неплохо передвигаюсь..." :)
Инструменты не требуют ни любви, ни ненависти, ими просто надо учиться пользоваться... а если лень, то придется отверстия, например, выдалбливать молотком и пробойником, вместо дрели...
Цитата:

Цитата John87
что то не работает ( »

В общем, скрипт надо корректировать под себя, т.е. указать правильный путь к каталогу, как минимум.

Вот скрипт 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 2993590

Код:

@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 2993617

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


megaloman 05-10-2022 13:22 2993628

John87,
Цитата:

Цитата John87
есть папка Logs, внутри каждый день создается папка с нов датой ......сделать bat, чтобы искал за предыдущий день логи и удалял оттуда строки »

Я попробовал повторить ситуацию.
Вопросы:
1. Папка D:\test1 существует?
2. В папке D:\test1 должны быть как минимум 2 подпапки: сегодняшняя и за предыдущий день. Скрипт не привязан к дате. Он пропускает самую свежую папку (по времени создания) и обрабатывает одну предыдущую.
3. В подпапках есть файлы с указанной маской *.txt?

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

John87 06-10-2022 08:21 2993663

megaloman, совсем забыл в тестовой папке создать еще одну. Спасибо, вроде работает!
теперь вопрос, он собирает нужное, кидает в нов файл, старые файлы он может удалить?

megaloman 06-10-2022 10:00 2993669

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 2993728

Вложений: 1
megaloman, начал пробовать на живом примере и меня постигла неудача ((

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

megaloman 08-10-2022 13:14 2993780

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 2993977

Цитата:

Цитата megaloman
А не проще ли переформулировать задачу: надо не удалять какие-то строки из исходных файлов, а сохранить некоторые строки в другой файл по заданным ключам поиска, если они в латинице? »

к сожалению там очень много что он умеет писать, посему проще избавиться от мусора!
на первое время удаление я исключу из формулы, пусть лежат оригиналы.

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

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

megaloman 11-10-2022 22:45 2994029

Код:

@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 2994035

Вложений: 1
Цитата:

Цитата megaloman
И лучше бы Вы предоставили 1 файл для тестирования »

не досмотрел (

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

DJ Mogarych 12-10-2022 10:25 2994041

powershell
Код:

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


megaloman 12-10-2022 20:04 2994072

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"

John87 13-10-2022 06:45 2994093

megaloman, в принципе меня устраивает, как работает вариант
Код:

cls
>nul chcp 1251
        Set "BoxIn=D:\test1"
        Set "Log=*.log"
        Set "ShortLogs=D:\test1\ShortLog"

        Set KeyWord=^|find /V /I "Обработано.записей.статусов"^|find /V /I "затрачено"

        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%)
                )
        )
:End
pause
Exit /B

я пока убрал goto exit и delete
в этом синтаксисе можно эти строки оставить но отменить? решеткой или еще как? чтоб файл был готов, и требовал минимальных изменений, а то забуду ведь (
кстати если я добавляю их в нынешний вариант, он ничего не удаляет и делает только один самый старый лог (


Время: 05:37.

Время: 05:37.
© OSzone.net 2001-