Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/40: Рейтинг темы: голосов - 40, средняя оценка - 4.75
Mashtar
0 / 0 / 0
Регистрация: 08.02.2014
Сообщений: 1
1

Поиск строк в одном txt-файле и добавление этих строк в другой txt-файл

12.02.2014, 10:05. Просмотров 7604. Ответов 8
Метки нет (Все метки)

Добрый день!
Помогите, пожалуйста, разобраться.
У меня лог файл, из которого мне нужно получить строки, в которых содержится определенное выражение, а именно:
"Регистрация клиента: {.... .... .... ....}"
Помогите написать скрипт, чтобы он доставал эти строки и копировал в другой файл.
Спасибо.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.02.2014, 10:05
Ответы с готовыми решениями:

Добавление строк, взятых из одного файла, в другие файлы в случае отсутствия этих строк в этих файлах
Есть древо папок с файлами 2.apk\res\values\strings.xml...

Обработка строк в txt-файле
добрый день, помагите плиз, есть файли-словарик, там строки выметал = вымет+ал...

Удаление нужных строк в файле .txt
Доброго времени суток! Подскажите пожалуйста текст батника, который бы...

Поиск одинаковых строк в текстовом файле и вывод дубликатов в другой текстовый файл
Добрый вечер. Нужна помощь знатоков Есть текстовый файл по пути...

Ограничить количество строк в txt-log файле
добрый день! у меня используется команда: echo %date% %time%...

8
YupiRex
186 / 143 / 32
Регистрация: 04.10.2013
Сообщений: 149
12.02.2014, 12:58 2
Лучший ответ Сообщение было отмечено как решение

Решение

Bash
1
2
3
4
5
::указать файл с логами
set logfile=test.txt
::указать выходной файл (куда копировать)
set newlog=outlog.txt
for /f "tokens=*" %%a in ('findstr /r ".*Регистрация клиента: {.*}.*" %logfile%') do  echo %%a>>%newlog%
3
gdm82
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 50
18.02.2014, 09:09 3
Если не сложно, подскажите на основе примера, как вытащить не только строку со словом, но и последующие 10 строк?
0
YupiRex
186 / 143 / 32
Регистрация: 04.10.2013
Сообщений: 149
19.02.2014, 05:52 4
Вот на все случаи жизни
можно задавать параметры в самом батнике, либо запускать с параметрами, либо изменять во время запуска
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
::----------input------------
::указать файл с логами
set lgfl=in866.txt
::указать выходной файл (куда копировать)
set nwlg=outlog.txt
::указать кол-во вывода строк до искомой
set num1=3
::указать кол-во вывода строк после искомой
set num2=4
::указать искомую строку
set word=.*Регистрация клиента: {.*}.*
cls
@echo off
setlocal EnableDelayedExpansion
if Not DEFINED %1 set lgfl=%1 2>nul
if Not DEFINED %2 set nwlg=%2 2>nul
if Not DEFINED %3 set num1=%3 2>nul
if Not DEFINED %4 set num2=%4 2>nul
if Not DEFINED %5 set word=%5 2>nul
 
set /p lgfl=файл с логами(текущее значение %lgfl%):
set /p nwlg=выходной файл(текущее значение %nwlg%):
set /p num1=кол-во вывода строк до искомой(текущее значение %num1%):
set /p num2=кол-во вывода строк после искомой(текущее значение %num2%):
set /p word=искомую строка(текущее значение %word%):
 
::----------Поиск номеров строк------------
for /f "delims=: tokens=1" %%a in ('findstr /n/r "%word%" %lgfl%') do  (call :pars %%a)
pause
exit /b
 
:pars
:: получение номера строки и вычисление количества отображаемых строк до и после
set /a isum=%num1%+%num2%+1
if %num1% lss %1 (
    set /a num=%1-%num1%-1
    set "skp=skip=!num! "
    ) else (
    set "skp="
    set /a isum=%num2%+%1
    )
:: вывод на экран и запись в файл
echo ------------------------%1------------------------
echo ------------------------%1------------------------>>%nwlg%
for /f "%skp%tokens=*" %%a in (%lgfl%) do (
    set /a isum-=1
    echo %%a  
    echo %%a>>%nwlg%
    if !isum! lss 1  exit /b)
exit /b
1
gdm82
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 50
24.02.2014, 10:12 5
как-то не пашет может где-то что-то надо добавить?
или я что-то лишнее вписал. Можно для конкретного примера указать?
лог: 1.txt
ищем строку со словом: тест
нужно выдернуть 2 строки до слова, саму строку со словом и 5 строк после строки со словом.

а то из приложенного кода рабочее собрать не вышло.

Как я понял:
set /p lgfl=файл с логами(текущее значение %lgfl%):
set /p nwlg=выходной файл(текущее значение %nwlg%):
set /p num1=кол-во вывода строк до искомой(текущее значение %num1%):
set /p num2=кол-во вывода строк после искомой(текущее значение %num2%):
set /p word=искомую строка(текущее значение %word%):
эти строки вообще для ручного ввода во всплывающем cmd?
0
YupiRex
186 / 143 / 32
Регистрация: 04.10.2013
Сообщений: 149
24.02.2014, 16:36 6
код:
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
::----------input------------
::указать файл с логами
set lgfl=in866.txt
::указать выходной файл (куда копировать)
set nwlg=outlog.txt
::указать кол-во вывода строк до искомой
set num1=2
::указать кол-во вывода строк после искомой
set num2=5
::указать искомую строку
set word=test
cls
@echo off
setlocal EnableDelayedExpansion
if Not DEFINED %1 set lgfl=%1 2>nul
if Not DEFINED %2 set nwlg=%2 2>nul
if Not DEFINED %3 set num1=%3 2>nul
if Not DEFINED %4 set num2=%4 2>nul
if Not DEFINED %5 set word=%5 2>nul
 
set /p lgfl=файл с логами(текущее значение %lgfl%):
set /p nwlg=выходной файл(текущее значение %nwlg%):
set /p num1=кол-во вывода строк до искомой(текущее значение %num1%):
set /p num2=кол-во вывода строк после искомой(текущее значение %num2%):
set /p word=искомую строка(текущее значение %word%):
 
::----------Поиск номеров строк------------
for /f "delims=: tokens=1" %%a in ('findstr /n /r "%word%" %lgfl%') do  (call :pars %%a)
pause
exit /b
 
:pars
:: получение номера строки и вычисление количества отображаемых строк до и после
set /a isum=%num1%+%num2%+1
if %num1% lss %1 (
    set /a num=%1-%num1%-1
    set "skp=skip=!num! "
    ) else (
    set "skp="
    set /a isum=%num2%+%1
    )
:: вывод на экран и запись в файл
echo ------------------------%1------------------------
echo ------------------------%1------------------------>>%nwlg%
for /f "%skp%tokens=*" %%a in (%lgfl%) do (
    set /a isum-=1
    echo %%a  
    echo %%a>>%nwlg%
    if !isum! lss 1  exit /b)
exit /b

in866.txt:
Кликните здесь для просмотра всего текста
Код
123
test
sdfad
sw4e
wqew qwer
test wqer
werwe test
hjkghjk
hgjkghjk

dfghdfgh
test fgh 


dfgsdgfs
sdfsg
sdfgsdfg
sdg
test test
sgdfgsdfgx

запускаем скрипт и жмем 5 раз энтер, получаем вывод в outlog.txt:
Кликните здесь для просмотра всего текста
Код
------------------------2------------------------
123
test
sdfad
sw4e
wqew qwer
test wqer
werwe test
------------------------6------------------------
sw4e
wqew qwer
test wqer
werwe test
hjkghjk
hgjkghjk
dfghdfgh
test fgh 
------------------------7------------------------
wqew qwer
test wqer
werwe test
hjkghjk
hgjkghjk
dfghdfgh
test fgh 
dfgsdgfs
------------------------12------------------------
dfghdfgh
test fgh 
dfgsdgfs
sdfsg
sdfgsdfg
sdg
test test
sgdfgsdfgx
------------------------19------------------------
sdfgsdfg
sdg
test test
sgdfgsdfgx


заменяем в 11 строке кода
Bash
1
set word=^^test
запускаем скрипт и жмем 5 раз энтер, получаем вывод в outlog.txt:
Кликните здесь для просмотра всего текста
Код
------------------------2------------------------
123
test
sdfad
sw4e
wqew qwer
test wqer
werwe test
------------------------6------------------------
sw4e
wqew qwer
test wqer
werwe test
hjkghjk
hgjkghjk
dfghdfgh
test fgh 
------------------------12------------------------
dfghdfgh
test fgh 
dfgsdgfs
sdfsg
sdfgsdfg
sdg
test test
sgdfgsdfgx
------------------------19------------------------
sdfgsdfg
sdg
test test
sgdfgsdfgx

заменяем в 11 строке кода
Bash
1
set word=test^$
запускаем скрипт и жмем 5 раз энтер, получаем вывод в outlog.txt:
Кликните здесь для просмотра всего текста
Код
------------------------2------------------------
123
test
sdfad
sw4e
wqew qwer
test wqer
werwe test
------------------------7------------------------
wqew qwer
test wqer
werwe test
hjkghjk
hgjkghjk
dfghdfgh
test fgh 
dfgsdgfs
------------------------19------------------------
sdfgsdfg
sdg
test test
sgdfgsdfgx

Синтаксис:
Кликните здесь для просмотра всего текста
Краткая сводка по синтаксису регулярных выражений:
. Любой символ.
* Повтор: ноль или более вхождений предыдущего символа или
класса
^ Позиция в строке: начало строки
$ Позиция в строке: конец строки
[класс] Класс символов: любой единичный символ из множества
[^класс] Обратный класс символов: любой единичный символ из дополнения
[x-y] Диапазон: любые символы из указанного диапазона
\x Служебный символ: символьное обозначение служебного символа x
\<xyz Позиция в слове: в начале слова
xyz\> Позиция в слове: в конце слова


Добавлено через 7 минут
Возможно проблема с кодировкой
2
gdm82
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 50
25.02.2014, 07:45 7
Цитата Сообщение от YupiRex Посмотреть сообщение
запускаем скрипт и жмем 5 раз энтер, получаем вывод в outlog.txt
Вот это и напрягает. Делается то для автоматизма, что бы поместить в автозагрузки или в расписание

Добавлено через 10 минут
set num1=1 перестает выдавать первые 2 варианта, излишнее разделение "------№-----"

Добавлено через 4 минуты
Энтеры то можно закоментить и все норм, разделители тоже. Но вот пока не допер, как убрать "для продолжения нажмите любую кнопку", это что за команда?

Добавлено через 13 минут
Для себя сделал
бат:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
set lgfl=1.txt
set nwlg=2.txt
set num1=1
set num2=3
set word=test
cls
@echo off
setlocal EnableDelayedExpansion
if Not DEFINED %1 set lgfl=%1 2>nul
if Not DEFINED %2 set nwlg=%2 2>nul
if Not DEFINED %3 set num1=%3 2>nul
if Not DEFINED %4 set num2=%4 2>nul
if Not DEFINED %5 set word=%5 2>nul
 
for /f "delims=: tokens=1" %%a in ('findstr /n /r "%word%" %lgfl%') do  (call :pars %%a)
pause
exit /b
 
:pars
set /a isum=%num1%+%num2%+1
if %num1% lss %1 (
    set /a num=%1-%num1%-1
    set "skp=skip=!num! "
    ) else (
    set "skp="
    set /a isum=%num2%+%1
    )
for /f "%skp%tokens=*" %%a in (%lgfl%) do (
    set /a isum-=1
    echo %%a  
    echo %%a>>%nwlg%
    if !isum! lss 1  exit /b)
exit /b
1.txt
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
1
2
3
4
test
5
6
7
8
9
 
1
2
3
4
test
5
6
7
8
9
 
1
2
3
4
test
5
6
7
8
9
2.txt
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
4
test
5
6
7
4
test
5
6
7
4
test
5
6
7
0
YupiRex
186 / 143 / 32
Регистрация: 04.10.2013
Сообщений: 149
25.02.2014, 16:48 8
Кликните здесь для просмотра всего текста
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
::----------input------------
::указать файл с логами
set lgfl=in866.txt
::указать выходной файл (куда копировать)
set nwlg=outlog.txt
::указать кол-во вывода строк до искомой
set num1=2
::указать кол-во вывода строк после искомой
set num2=5
::указать искомую строку
set word=test
cls
@echo off
setlocal EnableDelayedExpansion
:: Этот блок нужен для присваивания переменным параметров с которыми запускается батник,
:: пример запуска батника с параметрами:
:: Seach.bat 1.txt 2.txt 2 4 test
if Not DEFINED %1 set lgfl=%1 2>nul
if Not DEFINED %2 set nwlg=%2 2>nul
if Not DEFINED %3 set num1=%3 2>nul
if Not DEFINED %4 set num2=%4 2>nul
if Not DEFINED %5 set word=%5 2>nul
:: Этот блок удалить - если не нужно использование ввода параметров во время выполнения 
set /p lgfl=файл с логами(текущее значение %lgfl%):
set /p nwlg=выходной файл(текущее значение %nwlg%):
set /p num1=кол-во вывода строк до искомой(текущее значение %num1%):
set /p num2=кол-во вывода строк после искомой(текущее значение %num2%):
set /p word=искомую строка(текущее значение %word%):
 
::----------Поиск номеров строк------------
for /f "delims=: tokens=1" %%a in ('findstr /n /r "%word%" %lgfl%') do  (call :pars %%a)
pause &::Это команда: "для продолжения нажмите любую кнопку"
exit /b
 
:pars
:: получение номера строки и вычисление количества отображаемых строк до и после
set /a isum=%num1%+%num2%+1
if %num1% lss %1 (
    set /a num=%1-%num1%-1
    set "skp=skip=!num! "
    ) else (
    set "skp="
    set /a isum=%num2%+%1
    )
:: вывод на экран и запись в файл
echo. >>%nwlg%  &:: вывод разделения в файл
echo. &:: вывод разделения на экран
for /f "%skp%tokens=*" %%a in (%lgfl%) do (
    set /a isum-=1
    echo %%a  &:: строчка для вывода результатов на экран
    echo %%a>>%nwlg% &:: строчка для вывода результата в файл
    if !isum! lss 1  exit /b)
exit /b
4
gdm82
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 50
26.02.2014, 12:53 9
Все вышло как нельзя лучше в тестовом режиме пашет на ура . Спасибо.
Вот только что-то он мой файл не берет траблы с кодировками. Но это уже буду думать как сохранить в другой кодировке.
0
26.02.2014, 12:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2014, 12:53

Скрипт - удаление строк, которые содержат определенный символ в файле .txt
Товарищи, приветствую. Нужна ваша помощь. Честно пытался сам разобраться,...

Как записать много строк из bat в файл txt?
Есть bath файл, который получает некую информацию и записывает рез-тат в txt....

Вставить N последних строк одного TXT-файла в конец другого TXT-файла
Здравствуйте, подскажите пожалуйста, как можно скопировать n последних строк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru