在文件中的搜索字符串之前提取数字

时间:2013-11-11 13:18:20

标签: vbscript

我的日志看起来像这样

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

我尝试过搜索,却无法得到类似的情况。

请帮助我。

3 个答案:

答案 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