Показать полную графическую версию : [решено] Копирование нескольких строк текста в файл
Имеем огромный лог-файл.
Необходимо командой finfstr найти определенную строку и скопировать ее содержимое в файл плюс 5 строчек после нее. И так по всему файлу (таких блоков много). Как это можно сделать через cmd?
огромный лог-файл »что значит "огромный"?.. каков порядок виличины?
Какова максимальная длина строки? (FINDSTR имеет ограничение на длину обрабатываемых строк)
командой finfstr найти определенную строку »
по какому условию ищется строка? почему нельзя использовать обычный FIND ?
P.S. желательно привести алгоритм поиска строк + кусок лога с вхождением пары искомых блоков (само собой, в тегах CODE)
что значит "огромный"?.. каков порядок виличины? »
порядка 1-3 миллиона строк
Какова максимальная длина строки? »
150 символов
Пример куска лог-файла, который нужно искать (всегда начинается с NUMBER + 5 строк ниже):
NUMBER: 443160
Status : Warning
12-07-11 03:16:07
998fdr56-51aa29
F:570bac899119f3014h43160
G1:01555687
Алгоритм: ищем строку, начинающуюся с "NUMBER" и копируем ее в файл плюс еще 5 строк после нее. Нужно скопировать в файл все такие блоки.
ищем строку, начинающуюся с "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"
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"
Тот же вопрос, что и у ОП'а, но нужно текст этой строки использовать как название нового 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
и так далее до конца файла
Если верно то, что Вы указали, на 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
Спасибо!
Работает. Лишь файлы без расширения txt создает. Но это не проблема)
@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
Лишь файлы без расширения txt создает »
Я думал, что в файле имена с расширением будут. Добавьте выделенное:
With .CreateTextFile(objTS.ReadLine() & ".txt")
Доброго времени суток.
Из сказанного выше ни чего не понял, на форуме решение не нашёл.
Необходимо из файла скопировать поля из ==Сертификат 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
За ранее спасибо.
Validus, упакуйте образец файла:
Необходимо из файла скопировать поля »
в архив и прикрепите к сообщению. Если что-то особо секретное — под пароль, выкладывайте на RGhost. Ссылку и пароль на архив — в личку.
Временно удалось слепить вот это:
@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
Этот варварский скрипт работает только когда нужные мне данные появляются в конце файла, в иных случаях он бесполезен. Копаю дальше.
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
У меня вот, что получилось:
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:\>
В скрипте я ещё не разобрался, но может я делаю что-то не так?
Скопируйте вышеприведённый код. Создайте файл с расширением «.vbs». Вставьте в него из буфера обмена скопированный код, замените в нём выделенное Вашими значениями и сохраните. Затем можете запустить сохранённый файл двойным щелчком из Проводника.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.