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

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

Kainos 15-04-2015 13:03 2496063

Поиск строки по части названия и вывод данных в ECHO
 
Уважаемые форумчане!

Прошу вашего содействия в написании скрипта который искал бы данные с конца документа (документ во вложении).

Данные которые нужно найти:
MEIBillAccFWDownLoad 04/15 10:51:30 7,222,765 0AFC> Acceptor application software version is 286170390
MEIBillAccFWDownLoad 04/15 10:51:30 7,222,906 0AFC> Acceptor variant firmware version is 491908270
MEIBillAccFWDownLoad 04/15 10:51:30 7,223,078 0AFC> Acceptor serial number is 02294401340

Подчеркнуты статичные данные.

Принцип работы следующий:
1. Найти с конца документа эти 3 строки (их может быть больше, но нам нужны самые свежие которые располагаются в конце лога).
2. Вывести на экран следующую информацию:

04/15 10:51:30 Acceptor application software version is 286170390
04/15 10:51:30 Acceptor variant firmware version is 491908270
04/15 10:51:30 Acceptor serial number is 02294401340

Iska 15-04-2015 16:07 2496201

Попробуйте так (на WSH):
Скрытый текст
Код:

Option Explicit

Dim strSourceFile

Dim strContent
Dim arrPatterns
Dim strPattern


If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        With .OpenTextFile(strSourceFile)
                                strContent = .ReadAll()
                                .Close
                        End With
                Else
                        WScript.Echo "Can't find source file [" & strSourceFile & "]."
                        WScript.Quit 2
                End If
        End With
       
        arrPatterns = Array( _
                "MEIBillAccFWDownLoad (\d{2}/\d{2} \d{2}:\d{2}:\d{2} ).* (Acceptor application software version is \d+)", _
                "MEIBillAccFWDownLoad (\d{2}/\d{2} \d{2}:\d{2}:\d{2} ).* (Acceptor variant firmware version is \d+)", _
                "MEIBillAccFWDownLoad (\d{2}/\d{2} \d{2}:\d{2}:\d{2} ).* (Acceptor serial number is \d+)" _
        )
       
        With WScript.CreateObject("VBScript.RegExp")
                .IgnoreCase = True
                .Global    = True
               
                For Each strPattern In arrPatterns
                        .Pattern = strPattern
                       
                        If .Test(strContent) Then
                                With .Execute(strContent)
                                        With .Item(.Count - 1).Submatches
                                                WScript.Echo .Item(0) & .Item(1)
                                        End With
                                End With
                        Else
                                WScript.Echo "Can't find pattern [" & .Pattern & "] in source file [" & strSourceFile & "]."
                        End If
                Next
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


Путь к исходному файлу указывается аргументом скрипта.

Foreigner 15-04-2015 17:35 2496254

Вариант на PowerShell:
Код:

$data = get-content meibillaccfwdownload_093013.log | select-string '.+Acceptor.+is\s\d+'

$data[-3..-1] | foreach {

    $_ -replace '.*(\d{2}/\d{2}\s(\d{2}:?)+).+>(\s.+)$','$1$3'

}


Iska 15-04-2015 18:38 2496284

Цитата:

Цитата Foreigner
… select-string '.+Acceptor.+is\s\d+'
$data[-3..-1] …»

Это если быть уверенным, что строки с Acceptor будут строго по трое, не вперемежку.

Foreigner 15-04-2015 22:08 2496364

Iska, Ну ТС сказал, что новые строки дописываются в конец лога, вряд ли они могут перемешаться с предыдущими записями.

Kainos 16-04-2015 08:53 2496461

Iska, скрипт очень классный но почему то выдает данные с начала файла а не с конца. Можно это исправить?

Foreigner, Спасибо за скрипт, но к сожалению в той среде где он будет применяться нет PowerShell.

Iska 16-04-2015 11:10 2496492

Цитата:

Цитата Kainos
Iska, скрипт очень классный но почему то выдает данные с начала файла а не с конца. Можно это исправить? »

Kainos, добавьте «.Global = True» после «.IgnoreCase = True»:
Код:

                .IgnoreCase = True
                .Global    = True

Я поправил свой код выше.

Kainos 16-04-2015 12:57 2496542

Iska, Подскажите а можно добавить в текст вывода дополнительные слова (если это не сложно)?

Пример:
Было:
04/15 10:51:30 Acceptor application software version is 286170390
04/15 10:51:30 Acceptor variant firmware version is 491908270
04/15 10:51:30 Acceptor serial number is 02294401340

Стало:
04/15 10:51:30 Acceptor application software (Текст1) version is 286170390
04/15 10:51:30 Acceptor variant firmware (Текст2) version is 491908270
04/15 10:51:30 Acceptor serial number (Текст3) is 02294401340


Если для этого необходимо менять скрипт тогда обойдусь.

Iska 16-04-2015 13:27 2496558

Kainos, почему именно в середину шаблона поиска? Как Вы определяете место, куда надо вставлять текст?

Kainos 16-04-2015 13:43 2496573

Iska, Если проще в начале то меня устроит. Ну или в любом другом месте.

Iska 16-04-2015 14:34 2496607

Kainos, Вы меня не поняли. Озвучьте конкретику.

Kainos 16-04-2015 14:37 2496611

Iska, Текст который я вставляю просто статичный его нет в логе и для него нет особых условий, просто требуется что бы в этих строках было по несколько слов которых нет в оригинальном логе. Для каждой строки свой текст..

Iska 16-04-2015 16:15 2496666

Kainos, как прикажете мне определять «любое другое место» в строке? По какому принципу? Далее — зачем лог убрали, на чём проверять теперь?

Не проверялось:
Скрытый текст
Код:

Option Explicit

Dim strSourceFile

Dim strContent
Dim arrPatterns
Dim arrPattern


If WScript.Arguments.Count = 1 Then
        strSourceFile = WScript.Arguments.Item(0)
       
        With WScript.CreateObject("Scripting.FileSystemObject")
                If .FileExists(strSourceFile) Then
                        With .OpenTextFile(strSourceFile)
                                strContent = .ReadAll()
                                .Close
                        End With
                Else
                        WScript.Echo "Can't find source file [" & strSourceFile & "]."
                        WScript.Quit 2
                End If
        End With
       
        arrPatterns = Array( _
                Array( _
                        "MEIBillAccFWDownLoad (\d{2}/\d{2} \d{2}:\d{2}:\d{2} ).* (Acceptor application software version is \d+)", _
                        "software version", _
                        "software $$$ version", _
                        "(Текст1)" _
                ), _
                Array( _
                        "MEIBillAccFWDownLoad (\d{2}/\d{2} \d{2}:\d{2}:\d{2} ).* (Acceptor variant firmware version is \d+)", _
                        "firmware version", _
                        "firmware $$$ version", _
                        "(Текст2)" _
                ), _
                Array( _
                        "MEIBillAccFWDownLoad (\d{2}/\d{2} \d{2}:\d{2}:\d{2} ).* (Acceptor serial number is \d+)", _
                        "number is", _
                        "number $$$ is", _
                        "(Текст3)" _
                )
        )
       
        With WScript.CreateObject("VBScript.RegExp")
                .IgnoreCase = True
                .Global    = True
               
                For Each arrPattern In arrPatterns
                        .Pattern = arrPattern(0)
                       
                        If .Test(strContent) Then
                                With .Execute(strContent)
                                        With .Item(.Count - 1).Submatches
                                                WScript.Echo Replace(Replace(.Item(0) & .Item(1), arrPattern(1), arrPattern(2)), "$$$", arrPattern(3))
                                        End With
                                End With
                        Else
                                WScript.Echo "Can't find pattern [" & .Pattern & "] in source file [" & strSourceFile & "]."
                        End If
                Next
        End With
Else
        WScript.Echo "Usage: cscript.exe //nologo " & WScript.ScriptName & " <Source file>"
        WScript.Quit 1
End If

WScript.Quit 0


Georgio 16-04-2015 20:54 2496801

Цитата:

Цитата Kainos
Подскажите а можно добавить в текст вывода дополнительные слова (если это не сложно)?
Пример:
Было:
04/15 10:51:30 Acceptor application software version is 286170390
04/15 10:51:30 Acceptor variant firmware version is 491908270
04/15 10:51:30 Acceptor serial number is 02294401340
Стало:
04/15 10:51:30 Acceptor application software (Текст1) version is 286170390
04/15 10:51:30 Acceptor variant firmware (Текст2) version is 491908270
04/15 10:51:30 Acceptor serial number (Текст3) is 02294401340 »



Немного чёрной и белой магии, и Ваша задача решается с помощью такого красивейшего и оригинальнейшего кода пакетного файла:

Код:

@<"meibillaccfwdownload_093013.log" (
for %%i in (
 "Acceptor application software (Text 1) version is"
 "Acceptor variant firmware (Text 2) version is"
 "Acceptor serial number (Text 3) is"
 ) do @(
 for /f "delims=(" %%j in (%%i) do @(
  for /f "tokens=2,3,5*" %%k in ('find "%%j"') do @(
  for %%o in (%%n) do @set %%~i=%%k %%l %%~i %%o
  )
 )
 call echo %%%%~i%%
)
)
@pause>nul

.

Iska 16-04-2015 22:21 2496828

Цитата:

Цитата Georgio
Немного чёрной и белой магии, »

«Д'Артаньян чувствовал, что тупеет» ;).


Время: 22:20.

Время: 22:20.
© OSzone.net 2001-