batch命令用于搜索并输出搜索关键字第一次和最后一次出现之间的内容

时间:2016-09-19 14:52:41

标签: batch-file cmd

我有一个日志文件,我有一个关键字来搜索日志文件。现在,我必须从搜索关键字的第一次和最后一次出现之间提取该日志文件中的所有内容。即第一次和最后一次之间的所有事情。 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

1 个答案:

答案 0 :(得分: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前缀与 linenumber 匹配目标字符串的每个行号:然后将找到的第一个行号分配给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建立SETLOCAL/ENDLOCAL括号以允许{{1}的运行时值要访问1}}和startline

  • 总是最好地陈述完整的问题,因为它经常从根本上改变方法。