Компьютерный форум 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=196032)

mitiya 07-01-2011 19:32 1583263

как получить время и из строки в логе с определенным событием
 
еще интересно как к примеру получить время и из строки в логе с определенным событием
к примеру вот такой лог (log.txt)

Код:


[20101217:002616.27]:нужное событие
[20101217:002623.39]:ненужное событие
[20101217:002623.64]:нужное событие
[20101217:002624.27]:ненужное событие
[20101217:002624.39]:ненужное событие
[20101217:002624.89]:нужное событие
[20101217:002625.08]:ненужное событие

мне нужно получить время последнего нужного события

Iska 07-01-2011 20:23 1583286

mitiya, не очень понятно, как данный вопрос связан с озвученной темой — сие явно противоречит Правилам форума. Также хотелось бы, чтобы Вы освоили употребление знаков препинания и заглавных букв — это весьма способствует правильному пониманию заданного вопроса.

Предположим, что лог-файл находится в «c:\0001\0001.txt» и имеет кодировку ANSI. Тогда извлечь время (опять же, поскольку Вы не указали, — по моим предположениям, что именно эти символы — время) последнего совпавшего события можно, например, так:
читать дальше »
Код:

Option Explicit

Const ForReading = 1


Dim objRegExp
Dim objMatch

Dim strLine
Dim strTrueLine
Dim strSubMatch


Set objRegExp = WScript.CreateObject("VBScript.RegExp")

objRegExp.Pattern = "\[\d{8}:(\d{6}.\d{2})\]:нужное событие"

With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\0001\0001.txt", ForReading)
        Do Until .AtEndOfStream
                strLine = .ReadLine()
               
                If objRegExp.Test(strLine) Then
                        strTrueLine = strLine
                End If
        Loop
       
        .Close
End With

For Each objMatch In objRegExp.Execute(strTrueLine)
        For Each strSubMatch In objMatch.SubMatches
                WScript.Echo strSubMatch
        Next
Next

Set objRegExp = Nothing

WScript.Quit 0


Поскольку Вы не указали примерный размер лог-файла, чтение и разбор файла в примере производится не целиком, а построчно.

P.S.
Возможно, Вам покажется более удобным в данном случае пользовать LogParser посредством Automation, або непосредственно как утилиту командной строки:
vbscript: работаем с утилитой LogParser от Microsoft
vbscript: утилита LogParser от Microsoft, COM-интерфейс

mitiya 08-01-2011 00:04 1583457

сразу несколько вопросов.

1. хотел вынести путь к файлу в переменную но скрипт начал выдавать ошибку
Dim logpath = C:\0001\0001.txt

дальше по коду некоторые места непонятны

Код:


Option Explicit <-- зачем это

Const ForReading = 1


Dim objRegExp
Dim objMatch

Dim strLine
Dim strTrueLine
Dim strSubMatch


Set objRegExp = WScript.CreateObject("VBScript.RegExp")

objRegExp.Pattern = "\[\d{8}:(\d{6}.\d{2})\]:нужное событие"

With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\0001\0001.txt", ForReading)  я так понимаю тут
        Do Until .AtEndOfStream                                                                                                                        получается последняя нужная строка
                strLine = .ReadLine()
               
                If objRegExp.Test(strLine) Then
                        strTrueLine = strLine
                End If
        Loop
       
        .Close
End With

For Each objMatch In objRegExp.Execute(strTrueLine)            а тут то что не понятно
        For Each strSubMatch In objMatch.SubMatches                кроме вывода времени.
                WScript.Echo strSubMatch                                        так и не понял как отделили время от всей остальной строки
        Next
Next

Set objRegExp = Nothing

WScript.Quit 0


Iska 08-01-2011 01:16 1583493

Цитата:

Цитата mitiya
1. хотел вынести путь к файлу в переменную но скрипт начал выдавать ошибку
Код:

Dim logpath = C:\0001\0001.txt

Код:

Dim logpath
logpath = "C:\0001\0001.txt"

With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(logpath, ForReading)
    …

Цитата:

Цитата mitiya
а тут то что не понятно кроме вывода времени. так и не понял как отделили время от всей остальной строки

При помощи регулярных выражений. Рассказать в нескольких словах, к сожалению, не получится.

megaloman 08-01-2011 21:15 1583992

Без рег выражений (цикл списал у Iska) обрабатываем файл построчно
Код:

LogFile = "e:\Delete\0001.txt"
strFind = ":нужное событие"
lastfound = "нужное событие не состоялось"
i = 0

With CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, 1)
   
    Do Until .AtEndOfStream
        RL = .ReadLine()
        j = InStr(1, RL, strFind)        ' Ищем вхождение подстроки ":нужное событие" в каждой строке лог-файла

        If j > 0 Then
            lastfound = RL
            i = j
        End If
    Loop
   
    .Close
End With

MsgBox lastfound                                ' Если можно время с текстовкой
If i > 0 Then MsgBox Mid(lastfound, 1, i - 1)  ' Если только время со скобками -используем функцию Mid
If i > 0 Then MsgBox Mid(lastfound, 2, i - 3)  ' Если только время без скобок

То же самое - весь файл читаем в массив, массив просматриваем с конца. По идее, этот способ должен быть многократно быстрее. Ограничение на размер файла и число строк в нём не знаю.
Код:

LogFile = "e:\Delete\0001.txt"
strFind = ":нужное событие"
lastfound = "нужное событие не состоялось"
i = 0

With CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, 1)
    RL = Split(Replace(.ReadAll(), Chr(13), ""), Chr(10))
    .Close
End With
   
N = UBound(RL)
For j = N To 1 Step -1
    i = InStr(1, RL(j), strFind)
    If i > 0 Then
      lastfound = RL(j)
      Exit For
    End If
Next

MsgBox lastfound                                ' Если можно время с текстовкой
If i > 0 Then MsgBox Mid(lastfound, 1, i - 1)  ' Если только время со скобками
If i > 0 Then MsgBox Mid(lastfound, 2, i - 3)  ' Если только время без скобок


SendMessage 10-01-2011 08:49 1585039

Цитата:

Цитата megaloman
То же самое - весь файл читаем в массив, массив просматриваем с конца. По идее, этот способ должен быть многократно быстрее. »

Еще быстрее, если разделителем массива взять ":нужное событие". Тогда берется просто предпоследний элемент массива и парсится.
Но самый быстрый способ в данном конкретном случае такой:
Код:

Option Explicit

Const ForReading = 1

Dim LogFile
Dim strText

LogFile = "C:\0001\0001.txt"

With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(LogFile, ForReading)
  strText = .ReadAll
  .Close
End With

WScript.Echo Mid(strText, InStrRev(strText, "]:нужное событие") - 9, 9)

WScript.Quit 0


Iska 10-01-2011 12:30 1585148

Цитата:

Цитата megaloman
Ограничение на размер файла и число строк в нём не знаю. »

Цитата:

Цитата SendMessage
Но самый быстрый способ в данном конкретном случае такой: »

Ограничение достаточно простое —
читать дальше »
размер свободной физической памяти. Когда размер файла сопоставим с нею, то чаще бывает, что лучше дробить чтение на строки. Или же работать, по возможности, с такими файлами, как с базой данных — скажем, посредством OLE DB (vbscript: работа с большими текстовыми файлами), або с помощью LogParser (vbscript: работаем с утилитой LogParser от Microsoft).

SendMessage 10-01-2011 13:19 1585184

Iska, ну не стоит так уж заострять на этом внимание - вряд ли файл будет такого большого размера. Со 100 мб файлами мой скрипт вполне справляется.
А если уж он настолько велик, то и использовать FSO в любом виде уже не целесообразно (если только дробить, но не на строки, а при помощи Skip/Read). Как Вы справедливо и отметили. И скрипт будет совершенно другим по концепции. Но для этой конкретной задачи о нем, мне кажется, не стоит и заморачиваться. До тех пор пока не возникнет нужда. :)

Iska 10-01-2011 14:49 1585255

Дык, это :)… я и не заострял — пользовал в сообщении тэги «off» и «more».


Время: 22:36.

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