批量查找字符串并复制上面的1行和下面的x行

时间:2014-05-02 12:14:05

标签: batch-file

我有一个30,000行日志文件,其中包含多个错误报告。我正在寻找一种方法,我可以搜索出错误并将它们打印到一个新文件。我希望有人可以帮助我使用批处理文件来实现这一目标。下面我将发布一段有错误的日志文件,并准确解释需要提取的内容。

5/1/2014 12:13:26 PM:   Date & Time:    5/1/2014 12:13:26 PM
5/1/2014 12:13:26 PM:   Filename:       [sub_master_plan_new]
5/1/2014 12:13:26 PM:   Message:        Failed to export sub document. 
5/1/2014 12:13:26 PM:   Exception: Template fields are missing from the database: 
5/1/2014 12:13:26 PM:   Table=[ort_plan_comments_] Field=[PlanComReg1] FM=[False]
5/1/2014 12:13:26 PM:   Table=[ort_plan_comments_] Field=[planComRegion2] FM=[False]
5/1/2014 12:13:26 PM:   Table=[ort_plan_comments_] Field=[planComRegion3] FM=[False]
5/1/2014 12:13:26 PM:   Table=[ort_plan_comments_] Field=[planComReg4] FM=[False]
5/1/2014 12:13:26 PM:   Source: DocumentBuilder
5/1/2014 12:13:26 PM:   Stack:    at NextGen.EMR.Documents.DocumentBuilder.Document.DocumentImportExportWizard.ExportDocument(TxTextHelper wordHelper, DocumentInfo dInfo)
5/1/2014 12:13:26 PM:   
5/1/2014 12:13:26 PM:   END EXPORT: FILE[sub_master_plan_new]

首先,我需要日期/时间部分消失。接下来,每个错误都有文本"无法导出"在每个错误的第二行。我需要信息正上方的一行"无法导出"和消息正下方的任何行"无法导出"直到"来源:DocumentBuilder"线。

所以输出应该是这样的:

Filename:       [sub_master_plan_new]
Table=[ort_plan_comments_] Field=[PlanComReg1] FM=[False]
Table=[ort_plan_comments_] Field=[planComRegion2] FM=[False]
Table=[ort_plan_comments_] Field=[planComRegion3] FM=[False]
Table=[ort_plan_comments_] Field=[planComReg4] FM=[False]

非常感谢任何帮助,我不确定从哪里开始。感谢您提供的任何指示。


我的工作解决方案:谢谢你foxidrive

下载foxidrive链接的两个文件,并使用以下代码获得上述结果。

type errors.txt |repl ".*M:   " "" |findrepl "Failed to export" /e:"Source: DocumentBuilder" /o:-1:0 >> Output.txt

@echo off
Set "InputFile=Output.txt"
Set "OutputFile=Outted.txt"

setLocal EnableDelayedExpansion > "%OutputFile%"

for /f "usebackq tokens=* delims= " %%a in ("%InputFile%") do (
set s=%%a
>> "%OutputFile%" echo.!s:~20!
)

DEL Output.txt

type "Outted.txt"|repl "Source: DocumentBuilder" " " >"Output.txt"

DEL Outted.txt

type "Output.txt"|repl ":   " "" >"Outted.txt"

DEL Output.txt

type "Outted.txt"|repl "    " "" >"Output.txt"

DEL Outted.txt

type "Output.txt"|findstr /v /i "MessageFailed" >> ErrorsOnly.txt

DEL Output.txt

虽然非常凌乱。有用。最后,这对我来说至关重要。

3 个答案:

答案 0 :(得分:3)

这使用了两个名为repl.batfindrepl.bat

的帮助程序批处理文件

https://www.dropbox.com/s/rfdldmcb6vwi9xc/findrepl.bat下载 下载地址:https://www.dropbox.com/s/qidqwztmetbvklt/repl.bat

将它们放在与批处理文件相同的文件夹中或放在路径上的文件夹中。

  type file.log |repl ".*M:   " "" |findrepl "Failed to export" /e:"Source: DocumentBuilder" /o:-1:0

上面的代码返回以下行。看看它是否适用于您,或者您是否需要更多过滤。

文件名:[sub_master_plan_new1]
消息:导出子文档失败 例外:数据库中缺少模板字段:
表= [ort_plan_comments_] Field = [PlanComReg1] FM = [False]
表= [ort_plan_comments_] Field = [planComRegion2] FM = [False]
表= [ort_plan_comments_] Field = [planComRegion3] FM = [False]
表= [ort_plan_comments_] Field = [planComReg4] FM = [False]
资料来源:DocumentBuilder
文件名:[sub_master_plan_new2]
消息:导出子文档失败 例外:数据库中缺少模板字段:
表= [ort_plan_comments_] Field = [PlanComReg1] FM = [False]
表= [ort_plan_comments_] Field = [planComRegion2] FM = [False]
表= [ort_plan_comments_] Field = [planComRegion3] FM = [False]
表= [ort_plan_comments_] Field = [planComReg4] FM = [False]
资料来源:DocumentBuilder

答案 1 :(得分:0)

已编辑 - 我错过了标签。代码已更改

@echo off

    setlocal enableextensions disabledelayedexpansion

    set "filename="
    set "inError="
    for /f "usebackq tokens=3,* delims=:" %%a in ("LogFile.log"
    ) do for /f "tokens=*" %%t in ("%%b" 
    ) do for /f "tokens=1,2" %%c in ("%%t"
    ) do if "%%c"=="Source:" (
        set "inError="
    ) else if defined inError (
        echo(%%t
    ) else if "%%c"=="Filename:" (
        set "filename=%%t"
    ) else if "%%c"=="Message:" if "%%d"=="Failed" (
        setlocal enabledelayedexpansion
        echo(!filename!
        endlocal
        set "inError=1"
    )

    endlocal

第一个for将使用冒号分隔该行作为分隔符,从第三个元素开始(不会被使用)并检索该行的其余部分。所以datetime部分被丢弃了。

然后丢弃初始选项卡并拆分线以检索线中的第一个元素以确定它是什么类型的线。如果是"来源:",则错误块结束。如果是"文件名:",将其存储以便在错误开始时进行回显。如果我们处于错误块中,则回显该行,如果找到失败的消息,则回显存储的文件名并发出错误块信号,以便回显以下行。

答案 2 :(得分:0)

@ECHO OFF
SETLOCAL
:: remove variables starting $
FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
(
FOR /f "tokens=5*delims=: " %%a IN (q23427936.txt) DO (
 IF DEFINED $FTE (
  ECHO(%%b
  IF "%%b"=="Source: DocumentBuilder" SET "$FTE="
 ) ELSE ( 
  SET "$1=%%b"
  CALL :waitFTE
 )
 SET "$0=%%b" 
)
)>newfile.txt

GOTO :EOF
:waitFTE
ECHO("%$1%"|FIND "Failed to export" >NUL
IF ERRORLEVEL 1 GOTO :EOF
SET $FTE=Y
ECHO(%$0%
ECHO(%$1%
GOTO :eof

我使用了一个名为q23427936.txt的文件,其中包含我的测试数据。 生成newfile.txt