Показать полную графическую версию : как получить время и из строки в логе с определенным событием
еще интересно как к примеру получить время и из строки в логе с определенным событием
к примеру вот такой лог (log.txt)
[20101217:002616.27]:нужное событие
[20101217:002623.39]:ненужное событие
[20101217:002623.64]:нужное событие
[20101217:002624.27]:ненужное событие
[20101217:002624.39]:ненужное событие
[20101217:002624.89]:нужное событие
[20101217:002625.08]:ненужное событие
мне нужно получить время последнего нужного события
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
Поскольку Вы не указали примерный размер лог-файла, чтение и разбор файла в примере производится не целиком, а построчно.
Возможно, Вам покажется более удобным в данном случае пользовать LogParser (http://www.microsoft.com/technet/scriptcenter/tools/logparser/default.mspx) посредством Automation, або непосредственно как утилиту командной строки:
VBScript: работаем с утилитой LogParser от Microsoft (http://forum.script-coding.com/viewtopic.php?id=947)
VBScript: утилита LogParser от Microsoft, COM-интерфейс (http://forum.script-coding.com/viewtopic.php?id=934)
сразу несколько вопросов.
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
1. хотел вынести путь к файлу в переменную но скрипт начал выдавать ошибку
Dim logpath = C:\0001\0001.txt
Dim logpath
logpath = "C:\0001\0001.txt"
…
With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(logpath, ForReading)
…
а тут то что не понятно кроме вывода времени. так и не понял как отделили время от всей остальной строки
При помощи регулярных выражений. Рассказать в нескольких словах, к сожалению, не получится.
megaloman
08-01-2011, 21:15
Без рег выражений (цикл списал у 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
То же самое - весь файл читаем в массив, массив просматриваем с конца. По идее, этот способ должен быть многократно быстрее. »
Еще быстрее, если разделителем массива взять ":нужное событие". Тогда берется просто предпоследний элемент массива и парсится.
Но самый быстрый способ в данном конкретном случае такой:
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
Ограничение на размер файла и число строк в нём не знаю. »
Но самый быстрый способ в данном конкретном случае такой: »
Ограничение достаточно простое — размер свободной физической памяти. Когда размер файла сопоставим с нею, то чаще бывает, что лучше дробить чтение на строки. Или же работать, по возможности, с такими файлами, как с базой данных — скажем, посредством OLE DB (VBScript: работа с большими текстовыми файлами (http://forum.script-coding.com/viewtopic.php?id=1322)), або с помощью LogParser (VBScript: работаем с утилитой LogParser от Microsoft (http://forum.script-coding.com/viewtopic.php?id=947)).
SendMessage
10-01-2011, 13:19
Iska, ну не стоит так уж заострять на этом внимание - вряд ли файл будет такого большого размера. Со 100 мб файлами мой скрипт вполне справляется.
А если уж он настолько велик, то и использовать FSO в любом виде уже не целесообразно (если только дробить, но не на строки, а при помощи Skip/Read). Как Вы справедливо и отметили. И скрипт будет совершенно другим по концепции. Но для этой конкретной задачи о нем, мне кажется, не стоит и заморачиваться. До тех пор пока не возникнет нужда. :)
Дык, это :)… я и не заострял — пользовал в сообщении тэги «off» и «more».
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.