我的日志看起来像这样
2013-10-22 11:29:44 +02:00 - Info - Resultate
2013-10-22 11:29:44 +02:00 - Info - 1502 lines imported
2013-10-22 11:29:44 +02:00 - Info - 1 header lines
2013-10-22 11:29:44 +02:00 - Info - 1563 errors
2013-10-22 11:29:44 +02:00 - Info - 0 changed
2013-10-22 11:29:44 +02:00 - Info - 0 deleted
2013-10-22 11:29:44 +02:00 - Info - 0 not changed
2013-10-22 11:29:44 +02:00 - Info - 0 not found1-1
2013-10-22 11:29:44 +02:00 - Info - 1 empty lines
2013-10-22 11:29:44 +02:00 - Info - 1499 errors
我是VBScribt的新手,需要编写一个脚本来获取此文件中错误一词之前的数字。
我的预期输出是
1563
1499
我尝试过搜索,却无法得到类似的情况。
请帮助我。
答案 0 :(得分:2)
从短结构化文件获取信息的最佳方法是将.ReadAll()文件放入内存并应用从字符串中剪切所需数据的正则表达式。在代码中:
Option Explicit
Dim goFS : Set goFS = CreateObject( "Scripting.FileSystemObject" )
Dim reCut : Set reCut = New RegExp
reCut.Global = True
reCut.Pattern = "(\d+) errors"
Dim oMTS : Set oMTS = reCut.Execute(goFS.OpenTextFile("..\data\log.txt").ReadAll)
Dim oMT
For Each oMT IN oMTS
WScript.Echo oMT.SubMatches(0)
Next
输出:
1563
1499
答案 1 :(得分:1)
您可以向后读取每一行,检测到存在“错误”,然后从下面的空白处读取,直到下一个空格。
答案 2 :(得分:0)
处理日志文件的更好方法是将工作留给正确的工具。但是当我们无法访问这些工具时,第二个最佳选择是尝试将尽可能少的信息读入脚本。日志文件通常很大。因此,不要使用脚本代码进行阅读和搜索,而是让系统为您完成工作。因此,type
文件,使用findstr
进行过滤,使用空格作为分隔符,使用for
命令拆分记录,并仅从脚本中读取所需数据。
Dim oShell
Set oShell = WScript.CreateObject("WScript.Shell")
Dim strCommand
strCommand = "cmd /q /c ""for /F ""tokens=7 delims= "" %f in ('type ..\data.txt ^| findstr /r ""[0-9]+ errors"" ') do echo %f """
Dim oData
Set oData = oShell.Exec( strCommand )
Dim strData
strData = oData.StdOut.ReadAll()
Dim aData
aData = Split( strData, vbCrLf )
WScript.Echo strData