我有一个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
虽然非常凌乱。有用。最后,这对我来说至关重要。
答案 0 :(得分:3)
这使用了两个名为repl.bat
和findrepl.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