0

我的日志看起来像这样

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

我尝试搜索并且无法获得类似的情况。

请帮助我。

4

3 回答 3

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
于 2013-11-11T13:37:47.127 回答
1

您可以向后读取每一行,检测是否存在“错误”,然后从下一个空格读取直到下一个空格。

于 2013-11-11T13:22:54.580 回答
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
于 2013-11-12T16:11:15.890 回答