PDA

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


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

delure
13-07-2011, 11:45
Имеем огромный лог-файл.
Необходимо командой finfstr найти определенную строку и скопировать ее содержимое в файл плюс 5 строчек после нее. И так по всему файлу (таких блоков много). Как это можно сделать через cmd?

amel27
13-07-2011, 12:04
огромный лог-файл »что значит "огромный"?.. каков порядок виличины?
Какова максимальная длина строки? (FINDSTR имеет ограничение на длину обрабатываемых строк)

командой finfstr найти определенную строку »
по какому условию ищется строка? почему нельзя использовать обычный FIND ?

P.S. желательно привести алгоритм поиска строк + кусок лога с вхождением пары искомых блоков (само собой, в тегах CODE)

delure
13-07-2011, 12:41
что значит "огромный"?.. каков порядок виличины? »
порядка 1-3 миллиона строк

Какова максимальная длина строки? »
150 символов

Пример куска лог-файла, который нужно искать (всегда начинается с NUMBER + 5 строк ниже):
NUMBER: 443160
Status : Warning
12-07-11 03:16:07
998fdr56-51aa29
F:570bac899119f3014h43160
G1:01555687

Алгоритм: ищем строку, начинающуюся с "NUMBER" и копируем ее в файл плюс еще 5 строк после нее. Нужно скопировать в файл все такие блоки.

amel27
13-07-2011, 14:17
ищем строку, начинающуюся с "NUMBER" и копируем ее в файл плюс еще 5 строк после нее. »тут можно и без FIND(STR) обойтись:
(SetLocal EnableDelayedExpansion
set/a $ai=-1
for /f "usebackq delims=" %%a in ("file.log") do @(set "$a=%%a"
if "!$a:~,6!"=="NUMBER" set/a $ai=5
if !$ai! geq 0 set/a $ai-=1& echo:!$a!)
EndLocal)>"file.out"

delure
13-07-2011, 15:54
Спасибо.

DANGER_RAIDER
30-08-2012, 16:52
Помогите. Нужно тоже самое, только копировать эту строку и на одну выше.

(SetLocal EnableDelayedExpansion
set/a $ai=-1
for /f "usebackq delims=" %%a in ("file.log") do @(set "$a=%%a"
if "!$a:~,6!"=="NUMBER" set/a $ai=5
if !$ai! geq 0 set/a $ai-=1& echo:!$a!)
EndLocal)>"file.out"

поясните, если не трудно что тут что значит.
$ai=-1 - почему -1?
if "!$a:~,6!" - это количество символов, или что?
if !$ai! geq 0 set/a $ai-=1& echo:!$a!) - вообще не понял строки ктоме ЭХО

Заранее спасибо!!!

DANGER_RAIDER
30-08-2012, 17:13
(SetLocal EnableDelayedExpansion
set/a $ai=1
for /f "usebackq delims=" %%a in ("debug.log") do @(set "$a=%%a"
if "!$a:~,0!"=="User anton" set/a $ai=-1
if !$ai! geq 0 set/a $ai-=1& echo:!$a!)
EndLocal)>"1.txt"

Вот при таком раскладе копирует обе нужные строки, но только первые найденные, а не по всему файлу.

В чем я ошибся?

DANGER_RAIDER
03-09-2012, 10:42
Проблема решена)))

@echo off
SetLocal EnableDelayedExpansion

(for /f "usebackq tokens=* delims=" %%a in ("1.log") do (
set "$b=!$a!"
set "$a=%%a"
if not "!$a!"=="!$a:anton=!" (
echo !$b!
echo !$a!
)))>"2.txt"

eltanin
05-05-2013, 13:54
Тот же вопрос, что и у ОП'а, но нужно текст этой строки использовать как название нового txt файла, в который будут копироваться следующие 9 строчек.
Примерно вот так:

Grid 01 (следующие цифры копировать в Grid 01.txt)
003020600
900305001
001806400
008102900
700000008
006708200
002609500
800203009
005010300
Grid 02 (следующие цифры копировать в Grid 02.txt)
200080300
060070084
030500209
000105408
000000000
402706000
301007040
720040060
004010003
и так далее до конца файла

Iska
05-05-2013, 16:02
Если верно то, что Вы указали, на WSH:
Option Explicit

Dim objTS
Dim i


With WScript.CreateObject("Scripting.FileSystemObject")
Set objTS = .OpenTextFile("E:\Песочница\0247\0001.txt")

Do Until objTS.AtEndOfStream
With .CreateTextFile(objTS.ReadLine())
For i = 1 To 9
.WriteLine(objTS.ReadLine())
Next

.Close
End With
Loop

Set objTS = Nothing
End With

WScript.Quit 0

eltanin
05-05-2013, 21:26
Спасибо!
Работает. Лишь файлы без расширения txt создает. Но это не проблема)

Georgio
05-05-2013, 22:16
@ECHO OFF
ECHO FOR /F "skip=1 eol=E delims=_ tokens=2" %%%%I IN (Temp.cmd) DO CALL :Grid_%%%%I "Grid %%%%I.txt">Temp.cmd
ECHO :Grid_01>>Temp.cmd
ECHO ECHO OFF^>%%1>>Temp.cmd
FOR /F "usebackq skip=1 tokens=1*" %%I IN ("Your File") DO (
IF %%I==Grid (
ECHO EXIT /B>>Temp.cmd
ECHO :%%I_%%J>>Temp.cmd
ECHO ECHO OFF^>%%1>>Temp.cmd
) ELSE (
ECHO ECHO %%I^>^>%%1>>Temp.cmd
))
ECHO ERASE Temp.cmd^&^&EXIT>>Temp.cmd
CALL Temp.cmd

eltanin
05-05-2013, 22:32
Georgio, спасибо!

Iska
05-05-2013, 23:38
Лишь файлы без расширения txt создает »
Я думал, что в файле имена с расширением будут. Добавьте выделенное:
With .CreateTextFile(objTS.ReadLine() & ".txt")

Validus
30-12-2013, 16:18
Доброго времени суток.
Из сказанного выше ни чего не понял, на форуме решение не нашёл.
Необходимо из файла скопировать поля из ==Сертификат 1== в новый файл. Сертификатов может быть сколько угодно, идентификатор - SERVER-2-CA.


my "Личное"
================ Сертификат 0 ================
Серийный номер: 11111111111111111111111111111111111111
Поставщик: CN=SERVER-1-CA, DC=ya, DC=ru
NotBefore: 10.12.2013 14:42
NotAfter: 10.12.2014 14:42
Субъект: E=ivanov@ya.ru, CN=Иванов Иван Иванович, OU=Офис, OU=Организация, DC=ya, DC=ru
Имя шаблона сертификата (Тип сертификата): Test
Не корневой сертификат
Шаблон: Test, Пользователь
Хеш сертификата(sha1): 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11 11
Контейнер ключа = 11111111111111111111111111111111
Уникальное имя контейнера: 111111111111111111111111111111111111111111111111111111111111111111
Поставщик = Microsoft Enhanced Cryptographic Provider v1.0
Закрытый ключ НЕ экспортируем
Тест шифрования пройден

================ Сертификат 1 ================
Серийный номер: 22222222222222222222222222222222222222
Поставщик: CN=SERVER-2-CA, DC=mail, DC=ru
NotBefore: 10.12.2013 9:04
NotAfter: 10.12.2014 9:04
Субъект: E=petrov@mail.ru, CN=Петров Пётр Петрович, OU=Организация, DC=mail, DC=ru
Не корневой сертификат
Шаблон: Test
Хеш сертификата(sha1): 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
Контейнер ключа = 222222222222222222222222222222222222222
Поставщик = Microsoft Enhanced Cryptographic Provider v1.0
Закрытый ключ НЕ экспортируем
Тест шифрования пройден
CertUtil: -store — команда успешно выполнена.



Необходимые поля:

Серийный номер: 22222222222222222222222222222222222222
Поставщик: CN=SERVER-2-CA, DC=mail, DC=ru
NotBefore: 10.12.2013 9:04
NotAfter: 10.12.2014 9:04
Субъект: E=petrov@mail.ru, CN=Петров Пётр Петрович, OU=Организация, DC=mail, DC=ru
Хеш сертификата(sha1): 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22 22
Контейнер ключа = 222222222222222222222222222222222222222
Поставщик = Microsoft Enhanced Cryptographic Provider v1.0

За ранее спасибо.

Iska
30-12-2013, 16:29
Validus, упакуйте образец файла:
Необходимо из файла скопировать поля »
в архив и прикрепите к сообщению. Если что-то особо секретное — под пароль, выкладывайте на RGhost. Ссылку и пароль на архив — в личку.

Validus
10-01-2014, 13:32
Временно удалось слепить вот это:

@echo off
set OUTPUT=crv.txt

if "%STDOUT_REDIRECTED%" == "" (
set STDOUT_REDIRECTED=yes
cmd.exe /c %0 %* >%OUTPUT%
exit /b %ERRORLEVEL%
)

certutil.exe -store -user my > 1.txt

SetLocal EnableDelayedExpansion
::Кол-во строк, читаемых с конца файла
Set NLast=13
for /f "usebackq delims=" %%a in ("1.txt") do (
for /L %%C in (%NLast%,-1,2) do (
Set /A NN=%%C-1
for /L %%N in (!NN!,1,!NN!) do Set Line.%%C=!Line.%%N!
)
Set Line.1=%%a
)
for /L %%C in (%NLast%,-1,1) do Echo.!Line.%%C! >> cert.txt
del 1.txt
FINDSTR /I "Серийный номер" cert.txt
FINDSTR /I "AKBK-CERT-CA" cert.txt
FINDSTR /I "NotBefore" cert.txt
FINDSTR /I "NotAfter" cert.txt
FINDSTR /I "ект:" cert.txt
FINDSTR /I "корневой" cert.txt
FINDSTR /I "аблон" cert.txt
FINDSTR /I "sha1" cert.txt
FINDSTR /I "нер ключа" cert.txt
FINDSTR /I "Cryptographic Provider" cert.txt
del cert.txt

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

Iska
14-01-2014, 10:50
Validus, пробуйте:
Option Explicit

Dim strSourceFile
Dim strDestFile

Dim strPattern

Dim arrContent
Dim elem
Dim strLine


strSourceFile = "E:\Песочница\0350\1.txt"
strDestFile = "E:\Песочница\0350\Destination.txt"

strPattern = "SERVER-2-CA"

With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
With .OpenTextFile(strSourceFile)
arrContent = Split(.ReadAll(), " Сертификат ")
.Close
End With

With .CreateTextFile(strDestFile, True)
For Each elem In arrContent
If InStr(elem, "Поставщик: CN=" & strPattern) > 0 Then
For Each strLine In Split(elem, vbCrLf)
If Len(strLine) <> 0 Then
Select Case Trim(Split(strLine, ":")(0))
Case "Серийный номер", "Поставщик", "NotBefore", "NotAfter", "Субъект", "Хеш сертификата(sha1)"
.WriteLine strLine
End Select

Select Case Trim(Split(strLine, " = ")(0))
Case "Контейнер ключа", "Поставщик"
.WriteLine strLine
End Select
End If
Next
End If
Next

.Close
End With
Else
WScript.Echo "Source file [" & strSourceFile & "] not found."
WScript.Quit 1
End If
End With

WScript.Quit 0

Validus
14-01-2014, 11:42
У меня вот, что получилось:

Microsoft Windows [Version 6.2.9200]
(c) Корпорация Майкрософт, 2012. Все права защищены.

D:\>bat.bat

D:\>Option Explicit
"Option" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>Dim strSourceFile
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>Dim strDestFile
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>Dim strPattern
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>Dim arrContent
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>Dim elem
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>Dim strLine
"Dim" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>strSourceFile = "D:\1.txt"
"strSourceFile" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>strDestFile = "D:\Destination.txt"
"strDestFile" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>strPattern = "SERVER-2-CA"
"strPattern" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

D:\>With WScript.CreateObject("Scripting.FileSystemObject")
"With" не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Непредвиденное появление: Then.

D:\> If .FileExists(strSourceFile) Then

D:\>

В скрипте я ещё не разобрался, но может я делаю что-то не так?

Iska
14-01-2014, 12:05
Скопируйте вышеприведённый код. Создайте файл с расширением «.vbs». Вставьте в него из буфера обмена скопированный код, замените в нём выделенное Вашими значениями и сохраните. Затем можете запустить сохранённый файл двойным щелчком из Проводника.




© OSzone.net 2001-2012