【问题标题】:How to extract rows from a log file using Windows command line tools or batch file?如何使用 Windows 命令行工具或批处理文件从日志文件中提取行?
【发布时间】:2010-01-21 07:29:43
【问题描述】:

我想使用本地 Windows 命令行工具或批处理文件 (.bat) 从日志文件中提取某些行。这是一个示例日志文件:

2009-12-07 14:32:38,669 INFO  Sample log
2009-12-07 14:32:43,029 INFO  Sample log
2009-12-07 14:32:45,841 DEBUG Sample log
2009-12-07 14:32:45,841 DEBUG Sample log
2009-12-07 14:32:52,029 WARN  Sample log
2009-12-07 14:32:52,466 INFO  Sample log

如何提取和打印带有“WARN”标签的行?如何用 PowerShell 做到这一点?

【问题讨论】:

标签: regex powershell batch-file


【解决方案1】:

一种方式:

findstr WARN log.txt

更复杂:

for /f "tokens=1,2,3,4* delims=, " %i in (log.txt) do @if "%l"=="WARN" echo %i %j %m

OUTPUT:
2009-12-07 14:32:52 Sample log

【讨论】:

  • 我相信你应该这样使用" findstr "WARN" log.txt
【解决方案2】:

您可以使用 PowerShell 使用 select-stirng 来做到这一点:

select-String  WARN  *.log 

【讨论】:

  • 这是最好的和正确的答案,但需求经常扩大,迟早我们都会在这里结束:gci . -r *.log | % { gc $_.fullname | ? { $_ -cmatch "WARN" }}get-childitem . -recurse *.log | foreach { get-content $_.fullname | ? { $_ -cmatch "WARN" }}
【解决方案3】:

如果 PowerShell(由 Alon 建议)不是一个选项,也许 Logparser 可以满足您的需求:http://www.microsoft.com/downloads/details.aspx?FamilyID=890cd06b-abf8-4c25-91b2-f8d975cf8c07&displaylang=en

【讨论】:

    【解决方案4】:

    有几种方法,findstr/find 就像其他人向您展示的那样。或者你可以使用 vbscript

    Set objFS=CreateObject("Scripting.FileSystemObject")
    Set objArgs = WScript.Arguments
    strFile= objArgs(0)
    Set objFile = objFS.OpenTextFile(strFile)
    Do Until objFile.AtEndOfStream
        strLine = objFile.ReadLine
        If InStr(strLine,"WARN") > 0 Then
            WScript.Echo strLine
        End If 
    Loop
    

    另存为 mygrep_warn.vbs 并在命令行中

    c:\test> cscript //nologo mygrep_warn.vbs myfile.log
    

    其他方法,如果你可以下载东西并使用GNU *nix tools ported to win32

    C:\test>grep -i "warn" file
    2009-12-07 14:32:52,029 WARN  Sample log
    
    C:\test>gawk "BEGIN{IGNORECASE=1}/warn/" file
    2009-12-07 14:32:52,029 WARN  Sample log
    

    【讨论】:

      【解决方案5】:
      Get-EventLog -LogName application -EntryType warning
      

      并根据需要导出输出

      【讨论】:

        【解决方案6】:

        你总是可以尝试原来的 DOS“查找”命令,不过它很糟糕:

        c:>find " WARN " filename.log
        
        ---------- FILENAME.LOG
        2009-12-07 14:32:52,029 WARN  Sample log
        
        c:>
        

        您也不能在文件名中使用通配符。

        【讨论】:

        • 你可以使用findstr,但是你得到了正则表达式——有点像。 find 不是唯一的:-)
        • 我不再使用它,除非我使用的是基本的 Windows 机器并且别无选择。我以前从未听说过 findstr。看起来有点用!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-08
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2010-09-12
        • 1970-01-01
        相关资源
        最近更新 更多