Batch file 批处理以查找字符串并复制上面的1行和下面的x行

Batch file 批处理以查找字符串并复制上面的1行和下面的x行,batch-file,Batch File,我有一个30000行的日志文件,其中有几个错误报告。我正在寻找一种方法,我可以搜索出错误,并打印到一个新的文件。我希望有人能帮助我用批处理文件来实现这一点。下面我将发布一段日志文件,其中有一个错误,并准确地解释需要提取的内容 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 1

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

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]
首先,我需要删除日期/时间部分。接下来,每个错误的第二行都有文本“未能导出”。我需要消息“导出失败”正上方的行和消息“导出失败”正下方的任何行,直到“Source: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

虽然非常凌乱。它起作用了。最后,这对我来说才是最重要的。

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

@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
的第一个
将使用冒号作为分隔符拆分行,从第三个元素(不使用)开始,并检索行的其余部分。因此,datetime部分被丢弃

然后丢弃初始选项卡,并拆分该行以检索该行中的第一个元素,以确定它是哪种类型的行。如果是“Source:”,则错误块结束。如果它是“Filename:”,请将其存储起来,以便在错误开始时进行回显。如果我们在错误块中,则回显该行,如果找到失败消息,则回显存储的文件名和信号我们在错误块中,因此回显以下行。

@echo OFF
SETLOCAL
::删除开始时的变量$
对于/F“delims=”('set$2^>Nul')中的%%a,请执行设置“%%a=”
(
对于/f“tokens=5*delims=:”%(q23427936.txt)中的%%a(
如果定义为$FTE(
回声(%%b
如果“%%b”==“源:DocumentBuilder”设置“$FTE=”
)其他(
设置“$1=%%b”
电话:waitFTE
)
设置“$0=%%b”
)
)>newfile.txt
后藤:EOF
:waitFTE
ECHO(“%$1%”查找“无法导出”>NUL
如果错误级别1转到:EOF
设置$FTE=Y
回声(%$0%
回声(%$1%
后藤:eof
我使用了一个名为
q23427936.txt
的文件,其中包含用于测试的数据。
生成newfile.txt

这使用两个名为
repl.bat
findrepl.bat

下载地点:
下载地址:

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

  type file.log |repl ".*M:   " "" |findrepl "Failed to export" /e:"Source: DocumentBuilder" /o:-1:0
上面的代码返回下面的行。看看它是否对你有用,或者你是否需要更多的过滤

文件名:[子项目主计划新1]
消息:导出子文档失败。
异常:数据库中缺少模板字段:
表=[ort\U plan\U comments\U1]字段=[PlanComReg1]FM=[False]
表=[ort\U plan\U comments\U2]字段=[planComRegion2]FM=[False]
表=[ort\U plan\U comments\U3]字段=[planComRegion3]FM=[False]
表=[ort\U plan\U comments\U4]字段=[planComReg4]FM=[False]
来源:DocumentBuilder
文件名:[子项目主计划新2]
消息:导出子文档失败。
异常:数据库中缺少模板字段:
表=[ort\U plan\U comments\U1]字段=[PlanComReg1]FM=[False]
表=[ort\U plan\U comments\U2]字段=[planComRegion2]FM=[False]
表=[ort\U plan\U comments\U3]字段=[planComRegion3]FM=[False]
表=[ort\U plan\U comments\U4]字段=[planComReg4]FM=[False]

来源:DocumentBuilder

我对vb也很在行。我希望使用Powershell解析文件。为什么您的示例输出不包括
异常:…
行?如果
:文件名:
:表,请检查=[
只在出现错误时出现。如果是,这将使它变得非常简单。发生错误的是.dbenham。它是否存在并不重要。对我来说似乎不起作用。这是否应该覆盖旧文件,因为它只是运行,什么也没有发生。:/@Jordan,愚蠢的问题,但是,您是否已将第一个输入文件的名称更改为?文件.log应该是您的日志file@Jordan,对不起,是我的错。我复制了错误列表中的行,得到的是空格而不是制表符(编辑问题只是为了确定).Code更改以处理它们。我想我不明白这一点。它运行,看起来像是通过了,但没有输出。想法?这一个非常接近。当我对日志文件运行此命令时,我会得到很多额外的行,看起来像下面的行。END EXPORT:file[aud\u patient\u summary]START EXPORT:file[aud\u patient\u summary\u jcmr811]结束导出:文件[aud_patient_summary_jcmr811]开始导出:文件[aud_pedi_audiology_Reference]结束导出:文件[aud_pedi_audiology_Reference]开始导出:文件[aud_procedurenote]开始导出:文件[aud_rep_vng]结束导出:文件[aud_rep_vng]开始导出:文件[aud_rep_vng]开始导出:文件[aud_report_余额]结束导出:文件[aud_report_balance]开始导出:文件[aud_report_template_cabr]结束导出:文件[aud_report_template_cabr]开始导出:文件[aud_report_vng]这似乎在运行,但没有输出:/I我在这里遗漏了什么吗?我是用你的。我在末尾添加了>>output.txt。现在我只需要从开始删除日期,一切都很好。你提供的示例数据在我的测试中没有给我日期。在
>output.txt
上使用一个符号,这样它每次都会创建一个新的文件只是那次跑步的数据。我弄明白了。:)我严格修改了我的“RunMe.bat”