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

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

delure 13-07-2011 11:45 1712387

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

amel27 13-07-2011 12:04 1712400

Цитата:

Цитата delure
огромный лог-файл »

что значит "огромный"?.. каков порядок виличины?
Какова максимальная длина строки? (FINDSTR имеет ограничение на длину обрабатываемых строк)

Цитата:

Цитата delure
командой finfstr найти определенную строку »

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

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

delure 13-07-2011 12:41 1712423

Цитата:

Цитата amel27
что значит "огромный"?.. каков порядок виличины? »

порядка 1-3 миллиона строк

Цитата:

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

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 1712492

Цитата:

Цитата delure
ищем строку, начинающуюся с "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 1712560

Спасибо.

DANGER_RAIDER 30-08-2012 16:52 1979976

Помогите. Нужно тоже самое, только копировать эту строку и на одну выше.

(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 1979991

(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 1982034

Проблема решена)))

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

Тот же вопрос, что и у ОП'а, но нужно текст этой строки использовать как название нового 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 2144790

Если верно то, что Вы указали, на 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 2144993

Спасибо!
Работает. Лишь файлы без расширения txt создает. Но это не проблема)

Georgio 05-05-2013 22:16 2145029

Код:

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

Georgio, спасибо!

Iska 05-05-2013 23:38 2145077

Цитата:

Цитата eltanin
Лишь файлы без расширения txt создает »

Я думал, что в файле имена с расширением будут. Добавьте выделенное:
Код:

With .CreateTextFile(objTS.ReadLine() & ".txt")

Validus 30-12-2013 16:18 2280780

Доброго времени суток.
Из сказанного выше ни чего не понял, на форуме решение не нашёл.
Необходимо из файла скопировать поля из ==Сертификат 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 2280785

Validus, упакуйте образец файла:
Цитата:

Цитата Validus
Необходимо из файла скопировать поля »

в архив и прикрепите к сообщению. Если что-то особо секретное — под пароль, выкладывайте на RGhost. Ссылку и пароль на архив — в личку.

Validus 10-01-2014 13:32 2285993

Временно удалось слепить вот это:

Код:

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

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 2288809

У меня вот, что получилось:
Код:

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 2288817

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

Validus 14-01-2014 12:21 2288828

Скрипт работает, огромное спасибо.

Den472013 17-05-2016 15:02 2635418

Доброго времени суток имеется текстовый файл такого содержания приведу его ниже, необходимо скопировать строки хcoord и усoоrd и uid , файл большой до 5000 строк

Den472013 17-05-2016 15:23 2635421

Вложений: 1
Вот пример файла из которого надо извлечь строки

Den472013 17-05-2016 15:30 2635424

Вложений: 2
"ok": true,
"option": {
"scanTS": 1463483221,
"unfreezeTS": 1463490421,
"keptRsTS": 1463494021,
"xy": "691,789",
"ranges": ["80x80", "85x85", "90x90", "95x95", "100x100", "105x105", "110x110", "120x120", "130x130", "140x140"]
},
"data": [{
"tileId": "623844",
"xCoord": "714",
"yCoord": "789",
"tileCityId": 0,
"tileType": 60,
"tileCate": 2,
"mi": {
"i": {
"aid": 0,
"uid": 0
},
"c": {
"i4120": {
"tt": 385,
"tr": 385
},
"i2": {
"tt": 18,
"tr": 18
},
"i3": {
"tt": "8",
"tr": "8"
},
"i4": {
"tt": "2",
"tr": "2"
},
"i5": {
"tt": "1",
"tr": "1"
},
"i9": {
"tt": "3",
"tr": "3"
},
"i4060": {
"tt": 65,
"tr": 65
},
"i4061": {
"tt": "5",
"tr": "5"
},
"i5001": {
"tt": "30",
"tr": "30"
},
"i5002": {
"tt": "10",
"tr": "10"
},
"i5003": {
"tt": "3",
"tr": "3"
},
"i5101": {
"tt": 36,
"tr": 36
},
"i4901": {
"tt": "3",
"tr": "3"
},
"i6018": {
"tt": 33,
"tr": 33
},
"i20415": {
"tt": "80",
"tr": "80"
},
"i912": {
"tt": "3",
"tr": "3"
},
"i262": {
"tt": "3",
"tr": "3"
},
"i272": {
"tt": "3",
"tr": "3"
},
"i4005": {
"tt": "600",
"tr": "600"
},
"i4006": {
"tt": "200",
"tr": "200"
},
"i4007": {
"tt": "64",
"tr": "64"
},
"i599": {
"tt": "50",
"tr": "50"
},
"i600": {
"tt": "1",
"tr": "1"
},
"i1005": {
"tt": "5",
"tr": "5"
},
"i1006": {
"tt": 0,
"tr": 0
},
"i923": {
"tt": "3",
"tr": "3"
},
"i922": {
"tt": "1",
"tr": "1"
},
"i2101": {
"tt": "0",
"tr": "0"
},
"i64127": {
"tt": "3",
"tr": "3"
},
"i4131": {
"tt": "1",
"tr": "1"
}
},
"r": []
},
"dist": 23
}, {
"tileId": "611708",
"xCoord": "647",
"yCoord": "783",
"tileCityId": "11084",
"tileType": 60,
"tileCate": 2,
"mi": {
"i": {
"aid": "247",
"uid": "18505151"
},
"c": {
"i4120": {

Den472013 17-05-2016 15:31 2635425

Нужно сделать чтоб было так
"xCoord": "714",
"yCoord": "789",
"uid": 0

"xCoord": "647",
"yCoord": "783",
"uid": "18505151"

"xCoord": "640",
"yCoord": "792",
"uid": 0

Elven 17-05-2016 16:01 2635432

Den472013, cmd не умеет расковыривать *.doc . Если есть возможность сохранить файлы в текстовом формате то можно так:
Код:

findstr /i "XCoord yCoord uid" file.txt >> result.txt
если нет, то имеет смысл обратиться к powershell

Den472013 17-05-2016 20:44 2635498

Цитата:

Цитата Elven (Сообщение 2635432)
Den472013, cmd не умеет расковыривать *.doc . Если есть возможность сохранить файлы в текстовом формате то можно так:
Код:

findstr /i "XCoord yCoord uid" file.txt >> result.txt
если нет, то имеет смысл обратиться к powershell

можно в txt сохранить

Den472013 19-05-2016 09:14 2635839

Спасибо все получилось


Время: 18:54.

Время: 18:54.
© OSzone.net 2001-