Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - как получить время и из строки в логе с определенным событием

Ответить
Настройки темы
VBS/WSH/JS - как получить время и из строки в логе с определенным событием

Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


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

Код: Выделить весь код
[20101217:002616.27]:нужное событие
[20101217:002623.39]:ненужное событие 
[20101217:002623.64]:нужное событие
[20101217:002624.27]:ненужное событие 
[20101217:002624.39]:ненужное событие 
[20101217:002624.89]:нужное событие
[20101217:002625.08]:ненужное событие
мне нужно получить время последнего нужного события

Отправлено: 19:32, 07-01-2011

 

Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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-интерфейс

Последний раз редактировалось Iska, 07-01-2011 в 22:12.


Отправлено: 20:23, 07-01-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 440
Благодарности: 12

Профиль | Отправить PM | Цитировать


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

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

Отправлено: 00:04, 08-01-2011 | #3


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата mitiya:
1. хотел вынести путь к файлу в переменную но скрипт начал выдавать ошибку
Код: Выделить весь код
Dim logpath = C:\0001\0001.txt
Код: Выделить весь код
Dim logpath
logpath = "C:\0001\0001.txt"
…
With WScript.CreateObject("Scripting.FileSystemObject").OpenTextFile(logpath, ForReading)
    …
Цитата mitiya:
а тут то что не понятно кроме вывода времени. так и не понял как отделили время от всей остальной строки
При помощи регулярных выражений. Рассказать в нескольких словах, к сожалению, не получится.
Это сообщение посчитали полезным следующие участники:

Отправлено: 01:16, 08-01-2011 | #4


Ветеран


Contributor


Сообщения: 2733
Благодарности: 1698

Профиль | Отправить PM | Цитировать


Без рег выражений (цикл списал у 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)   ' Если только время без скобок

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 08-01-2011 в 22:12.

Это сообщение посчитали полезным следующие участники:

Отправлено: 21:15, 08-01-2011 | #5


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


Цитата 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

Последний раз редактировалось SendMessage, 10-01-2011 в 08:55.


Отправлено: 08:49, 10-01-2011 | #6


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:30, 10-01-2011 | #7


Старожил


Сообщения: 175
Благодарности: 119

Профиль | Отправить PM | Цитировать


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

Отправлено: 13:19, 10-01-2011 | #8


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


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

Отправлено: 14:49, 10-01-2011 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - как получить время и из строки в логе с определенным событием

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - как получить дату и время, независимо от типа отображения даты ? mitiya Скриптовые языки администрирования Windows 3 20-12-2010 11:14
CMD/BAT - [решено] Подскажите как получить время изменения файла -15 минут osp2008 Скриптовые языки администрирования Windows 7 29-07-2010 15:04
[решено] Как получить данные в скрипт из командной строки? madmasles AutoIt 2 27-11-2009 15:50
Как получить время с сервера lehha Программирование и базы данных 2 10-04-2004 00:49
Как получить путь к файлу в виде строки на Visual Basic .NET Igor Laptev Программирование и базы данных 1 14-10-2003 00:50




 
Переход