PDA

Показать полную графическую версию : [решено] Умный Поиск слов в файлах!


muqanna
28-10-2014, 09:51
Есть два папки одних логи в втором сами файлы! Лог видеться на ошибках работе!
Так задача: Батник должен зайти папку с лог файлами взять файл там найти слова error после слова идет номер ошибке
error(пробел)121546(пробел)0121 (номер не повторяется) считать этот номер зайти второй папку с файлами и там в файлах найти это номер и скопировать этот файл с логом в другую папку. Было бы хорошо если они были в папки по пара каждый лог, их много!
Благодарю оказавших помощь!

Georgio
29-10-2014, 13:25
@echo off

set "logs_dir=D:\Logs"
set "files_dir=D:\Files"
set "copies_dir=D:\Copies"

for /f "delims=" %%i in ('findstr /irc:"error [0-9][0-9]* [0-9][0-9]*" "%logs_dir%\*"') do (
set var=%%i
for /f "tokens=1,2 delims=$" %%j in ('call set /p"=%%var:error =$%%"^<nul') do (
for /f "tokens=1,2" %%l in ("%%k") do (
for /f "delims=" %%n in ('findstr /mc:"%%l %%m" "%files_dir%\*"') do (
echo f| xcopy "%%n" "%copies_dir%\%%l %%m\%%~nxn">nul
for /f "tokens=1,2 delims=:" %%o in ("%%j") do (
copy "%%o:%%p" "%copies_dir%\%%l %%m">nul
)
)
)
)
)

exit /b

muqanna
29-10-2014, 14:21
щя проверю, но все равно спасибо за внимания!

muqanna
29-10-2014, 16:15
Georgio извиняюсь я вас чуть-чуть обманул признак выглядит так:
error(пробел)12.15.4.6(пробел)0121 Когда я удалил там точки класс все работает! Хотел сам решит эту проблему но не как не получается! Но вам Спасибо!

Georgio
29-10-2014, 16:37
Когда я удалил там точки класс все работает! »


muqanna, не надо удалять точки. Просто тогда так:

for /f "delims=" %%i in ('findstr /irc:"error [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]* [0-9][0-9]*" "%logs_dir%\*"') do (.

muqanna
30-10-2014, 06:39
понял щя проверим! ... :yahoo:

muqanna
30-10-2014, 12:10
спасибо все работает!
Georgio Вопрос с того же сценарии если Variant=asda234e4sdaasd; типа такого мне надо взять код после = до ; а код может всегда меняться может 1 однозначной или 30 или 50 значения не ограниченно по количеству. Или такой вариант ищу слова Variant когда нахожу его
надо считать слова My Variant тут место my variant может быт любой слова! А Variant не меняется!
<input type="Variant" name="ie" value="windows-1251" >My Variant</>
Потом все это залит в тхт файл!
Спасибо за внимания!

muqanna
30-10-2014, 16:29
Georgio Вопрос по первому примеру. Как можно сделать так что когда копирует файл из Logs, primer.log заберал primer_00.log копировал его тоже, ну типа как primer*.*! Сам тоже ковыряюсь боюсь испортит код сделано очень умно! Я в шоки что bat ники творят чудеса!

Georgio
31-10-2014, 04:38
если Variant=asda234e4sdaasd; типа такого мне надо взять код после = до ; а код может всегда меняться может 1 однозначной или 30 или 50 значения не ограниченно по количеству. »

for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "example.txt"') do echo %%i>>"Variant.txt"

Georgio
31-10-2014, 05:47
ищу слова Variant когда нахожу его
надо считать слова My Variant тут место my variant может быт любой слова! А Variant не меняется!
<input type="Variant" name="ie" value="windows-1251" >My Variant</> »

for /f "tokens=2 delims=<>" %%i in ('findstr /irc:"^\<input type=\"Variant\" name=\"ie\" value=\"windows\-1251\" \>..*\<\/\>$" "example.txt"') do echo %%i>>"Variant.txt"

Georgio
31-10-2014, 06:05
Как можно сделать так что когда копирует файл из Logs, primer.log заберал primer_00.log копировал его тоже, ну типа как primer*.*! »


@echo off

:: Значением переменных могут быть только полные имена папок!
set "logs_dir=D:\Logs"
set "files_dir=D:\Files"
set "copies_dir=D:\Copies"

for /f "delims=" %%i in ('findstr /irc:"error [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]* [0-9][0-9]*" "%logs_dir%\*"') do (
set var=%%i
for /f "tokens=1,2 delims=$" %%j in ('call set /p"=%%var:error =$%%"^<nul') do (
for /f "tokens=1,2" %%l in ("%%k") do (
for /f "delims=" %%n in ('findstr /mc:"%%l %%m" "%files_dir%\*"') do (
echo f| xcopy "%%n" "%copies_dir%\%%l %%m\%%~nxn">nul
for /f "tokens=1,2 delims=:" %%o in ("%%j") do (
copy "%%o:%%~pnp*%%~xp" "%copies_dir%\%%l %%m">nul
)
)
)
)
)

exit /b

muqanna
31-10-2014, 09:54
Georgio
(copy "%%o:%%~pnp*%%~xp" "%copies_dir%\%%l %%m">nul)
пишет ошибку:
Синтаксическая ошибка в имени файла, имени папки или метке тома.
-------------------------------------------------------------------
for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "example.txt"') do echo %%i>>"Variant.txt"

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

set "files_dir=D:\Files"
for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "%files_dir%\*"') do (
set var=%%i
echo %%i>>"Variant.txt")
может я что то не правильно делаю?
--------------------------------------------------------------------

Georgio
01-11-2014, 03:48
for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "example.txt"') do echo %%i>>"Variant.txt"
я хотел его сделать что он работал с файлами из папки но он все равно с одной работает!
set "files_dir=D:\Files"
for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "%files_dir%\*"') do (
set var=%%i
echo %%i>>"Variant.txt")
может я что то не правильно делаю? »

muqanna, findstr /irc:".*Variant=..*;.*" "example.txt" и findstr /irc:".*Variant=..*;.*" "%files_dir%\*-- всё-таки разные команды, поэтому и вывод результата у них разный. Конечно, Вы неправильно делаете. Чтобы эту конструкцию, предназначенную для поиска в одном файле, приспособить для поиска в разных файлах, нужно номер "токена" (или номера "токенов") увеличить на 2 и добавить в разделители двоеточие. Вот так будет работать: for /f "tokens=4 delims==;:" %%i in ('findstr /irc:".*Variant=..*;.*" "D:\Files\*"') do echo %%i>>"Variant.txt".

muqanna
01-11-2014, 07:00
@echo off

:: Значением переменных могут быть только полные имена папок!
set "logs_dir=D:\Logs"
set "files_dir=D:\Files"
set "copies_dir=D:\Copies"

for /f "delims=" %%i in ('findstr /irc:"error [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]* [0-9][0-9]*" "%logs_dir%\*"') do (
set var=%%i
for /f "tokens=1,2 delims=$" %%j in ('call set /p"=%%var:error =$%%"^<nul') do (
for /f "tokens=1,2" %%l in ("%%k") do (
for /f "delims=" %%n in ('findstr /mc:"%%l %%m" "%files_dir%\*"') do (
echo f| xcopy "%%n" "%copies_dir%\%%l %%m\%%~nxn">nul
for /f "tokens=1,2 delims=:" %%o in ("%%j") do (
copy "%%o:%%~pnp*%%~xp" "%copies_dir%\%%l %%m">nul
)
)
)
)
)

exit /b



пишет ошибку:
Синтаксическая ошибка в имени файла, имени папки или метке тома.

muqanna
01-11-2014, 10:16
Цитата Georgio: »
батник больших файлах слова поиска что то не находить пропускает. Я файл посмотрел длина строки где то более 15000 знаков! слова Variant=abrakadabra почти самом конце находится! Думаю может из за это не берет?for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "example.txt"') do echo %%i>>"Variant.txt" »

Georgio
02-11-2014, 09:44
@echo off
:: Значением переменных могут быть только полные имена папок!
set "logs_dir=D:\Logs"
set "files_dir=D:\Files"
set "copies_dir=D:\Copies"
for /f "delims=" %%i in ('findstr /irc:"error [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]* [0-9][0-9]*" "%logs_dir%\*"') do (
set var=%%i
for /f "tokens=1,2 delims=$" %%j in ('call set /p"=%%var:error =$%%"^<nul') do (
for /f "tokens=1,2" %%l in ("%%k") do (
for /f "delims=" %%n in ('findstr /mc:"%%l %%m" "%files_dir%\*"') do (
echo f| xcopy "%%n" "%copies_dir%\%%l %%m\%%~nxn">nul
for /f "tokens=1,2 delims=:" %%o in ("%%j") do (
copy "%%o:%%~pnp*%%~xp" "%copies_dir%\%%l %%m">nul
)
)
)
)
)
exit /b

пишет ошибку:
Синтаксическая ошибка в имени файла, имени папки или метке тома. »


muqanna, на моей модели пакетный файл с данным кодом отрабатывает корректно. Чтобы что-то выяснить, мне нужен полностью Ваш код, структура обрабатываемых папок с именами файлов и образцы этих файлов.



батник больших файлах слова поиска что то не находить пропускает. Я файл посмотрел длина строки где то более 15000 знаков! слова Variant=abrakadabra почти самом конце находится! Думаю может из за это не берет?
for /f "tokens=2 delims==;" %%i in ('findstr /irc:".*Variant=..*;.*" "example.txt"') do echo %%i>>"Variant.txt" »


muqanna, да. У команды "FINDSTR" проблемы с длинными строками. Попробуйте с помощью команды "FIND": for /f "tokens=2 delims==;" %%i in ('^<"example.txt" find /i "Variant="^| find ";"') do echo %%i>>"Variant.txt".
Гарантию не даю.

Iska
02-11-2014, 10:24
muqanna, да. У команды "FINDSTR" проблемы с длинными строками. »
И ещё эта длина зависит от версии утилиты (конкретнее — от ОС, в составе которой она поставляется).

muqanna
04-11-2014, 08:56
Цитата Georgio:
можно ли организовать поиск с конца строки? Ну считать строку искать слова с конца в перед! (пробовал FIND все равно длинных строк пропускает) »
Цитата Georgio:
copy "%%o:%%~pnp*%%~xp" "%copies_dir%\%%l %%m">nul
если смотреть когда код выполняется он показывает что primer*.* но не копирует! Хотя файлы одинаковые primer.txt и primer_0.txt; primer.txt копирует а primer_0.txt не копирует по структуре файлы одинаковы! »

Georgio
05-11-2014, 06:56
можно ли организовать поиск с конца строки? Ну считать строку искать слова с конца в перед! »

muqanna, теоретически можно всё, но, чтобы выяснить, возможно ли это практически, нужны образцы этих файлов ».


если смотреть когда код выполняется он показывает что primer*.* но не копирует! Хотя файлы одинаковые primer.txt и primer_0.txt; primer.txt копирует а primer_0.txt не копирует »

Чтобы что-то выяснить, мне нужны полностью Ваш код, структура обрабатываемых папок с именами файлов и образцы этих файлов. »




© OSzone.net 2001-2012