2016-09-19 91 views
-1

我有一个日志文件,我有一个关键字来搜索日志文件。现在我必须从搜索关键字的第一次和最后一次出现之间的日志文件中提取所有内容。即在第一次和最后一次出现之间的一切。 findstr命令只列出了具有搜索关键字的行,而不是其间的其他内容。我需要批处理命令来做到这一点。批量命令搜索和输出内容的第一次和最后一次出现的搜索键

例如。

log.txt 
[mave123]sddasnsdaskdasddansnmdmsmdasdasda 
[mave123]dfdfdf 
fsffasf 
safaaf 
fasfssfdfdsfdsf 
[mave123]dfsfsdfsdfssdfssfd 
[mave124]rdfsdfsfsfsf 
[mave124]dfdfsdfsfsdfs 

现在的“FINDSTR mave123的log.txt”将返回如下

[mave123]sddasnsdaskdasddansnmdmsmdasdasda 
[mave123]dfdfdf 
[mave123]dfsfsdfsdfssdfssfd 

但我想所有的拳头和mave123的最后出现的内容。即像这样。你能帮忙吗?

[mave123]sddasnsdaskdasddansnmdmsmdasdasda 
[mave123]dfdfdf 
fsffasf 
safaaf 
fasfssfdfdsfdsf 
[mave123]dfsfsdfsdfssdfssfd 
+0

请阅读整个[旅游网页](http://stackoverflow.com/tour)并了解本网站的工作原理! – aschipfl

+1

请注意,https://stackoverflow.com不是一个免费的脚本/代码写入服务。如果您告诉我们您迄今为止所尝试的内容(包括您已经使用的脚本/代码)以及您卡住的位置,那么我们可以尝试帮助解决特定问题。您还应该阅读[我如何提出一个好问题?](https://stackoverflow.com/help/how-to-ask)。 – DavidPostill

回答

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q35976147.txt" 
SET "outfile=%destdir%\outfile.txt" 
SET "target=%~1" 
IF NOT DEFINED target GOTO :eof 
SET "startline=" 
FOR /f "delims=:" %%a IN ('findstr /N /L /c:"%target%" "%filename1%" ') DO (
IF NOT DEFINED startline SET /a startline=%%a 
SET /a endline=%%a 
) 
IF NOT DEFINED startline ECHO NOT found&GOTO :EOF 

(
FOR /f "tokens=1*delims=:" %%a IN ('findstr /N /r "." "%filename1%" ') DO (
IF %%a geq %startline% (
    IF %%a leq %endline% (ECHO %%b) ELSE (GOTO nextstep) 
) 
) 
)>"%outfile%" 
:nextstep 
GOTO :EOF 

你需要改变的sourcedirdestdir设置以适合你的情况。

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

定义为%OUTFILE%的文件生成

第一for前缀的每一行数目标串与行号匹配:然后分配发现startline所述第一行号和令人惊讶的最后endline

第二个for重复此操作,此时输出所选范围中的行。

这将抑制任何线路上的前导:。我没有测试空行。


修订为 “所有匹配的文件”

@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "target=%~1" 
IF NOT DEFINED target GOTO :eof 
FOR %%j IN ("%sourcedir%\log_*.txt".) DO (
ECHO %%j 
SET "startline=" 
FOR /f "delims=:" %%a IN ('findstr /N /L /c:"%target%" "%%j" ') DO (
    IF NOT DEFINED startline SET /a startline=%%a 
    SET /a endline=%%a 
) 
IF DEFINED startline (
    SETLOCAL enabledelayedexpansion 
    (
    FOR /f "tokens=1*delims=:" %%a IN ('findstr /N /r "." "%%j" ') DO (
    IF %%a geq !startline! IF %%a leq !endline! (ECHO %%b) 
) 
    ENDLOCAL 
)>"%destdir%\%%~nj.out" 
) ELSE (
    ECHO "%target%" NOT found IN %%j 
) 
) 
GOTO :EOF 

这里,%%j接收要处理的文件的名称。目标文件是从目标目录名称,源文件的名称部分(%%~nj)和.out构建而成的。建立了一个支架,以允许访问运行时间值startlineendline

  • 总是最好的陈述完整的问题,因为它通常会彻底改变方法。
+0

非常感谢,它确实帮了很大忙。但是,您还可以提供一个解决方案,其中源文件不是一个文件,而是一堆文件。就像这些文件被命名为log_09212016.txt,log_09222016,log_09232016 ...等等,我想搜索所有的文件,如log * .txt? – Bromeo

相关问题