优化日志文件解析与输出方法及脚本逻辑调整求助
解决脚本日志提取的条件写入问题
看起来你现在的脚本不管有没有匹配到目标内容,都会给%parse%文件写入记录,这确实不是你想要的效果——咱们只需要在findstr找到目标内容时,才执行写入操作就行。
先看常见的错误写法(大概是你现在的情况)
比如这种写法会导致每一行都被写入:
@echo off set "parse=output.txt" for /f "tokens=*" %%a in (your_log_file.txt) do ( echo %%a | findstr "Start c:\pr" echo Tue 04/03/2018 - 13:51:23.19 - <Removed_UN> - <Removed_HostName> - %%a >> %parse% )
问题出在:不管findstr有没有命中目标,后面的echo语句都会执行,所以每一行日志都被追加到了输出文件里。
修正后的脚本写法
咱们利用findstr的退出码来做判断——当它找到匹配内容时,errorlevel会设为0,没找到则为1。基于这个特性调整脚本:
@echo off set "parse=output.txt" :: 替换成你实际要匹配的目标内容 set "target_content=Start c:\pr" for /f "tokens=*" %%a in (your_log_file.txt) do ( :: 用/c参数确保匹配带空格的完整字符串,>nul避免在控制台打印匹配结果 echo %%a | findstr /c:"%target_content%" >nul :: 只有当findstr匹配成功时,才执行写入操作 if not errorlevel 1 ( :: 这里按你需要的格式写入,示例用你给出的格式 echo Tue 04/03/2018 - 13:51:23.19 - <Removed_UN> - <Removed_HostName> - %%a >> %parse% ) )
额外优化:如果日志字段是动态的
如果日志里的时间、用户、主机名不是固定值,而是需要从每行日志里提取的,比如你的日志行格式是:
Tue 04/03/2018 - 13:51:23.19 - <Removed_UN> - <Removed_HostName> - -------------- Start c:\pr...
那可以调整for循环的tokens参数来提取这些动态字段,再拼接写入:
@echo off set "parse=output.txt" set "target_content=Start c:\pr" :: 用delims=-分割每行,tokens=1-8*表示前8个分割段分别给%%a到%%h,剩下的内容给%%i for /f "tokens=1-8* delims=-" %%a in (your_log_file.txt) do ( echo %%i | findstr /c:"%target_content%" >nul if not errorlevel 1 ( :: 拼接回原格式写入 echo %%a - %%b - %%c - %%d - %%i >> %parse% ) )
这样就能精准地只把包含目标内容的日志行写入%parse%文件了。
内容的提问来源于stack exchange,提问作者Joshua Dixon
相关产品推荐
相关产品推荐

