用于提取特定词之间的行的批处理脚本

时间:2015-04-22 22:31:11

标签: batch-file

我有一个输入文件 - >

启动日志文件

on entry.....  
transition....  
state .....  
some logs....  
**** PRINT   
Entry  
....  
.....  
ID = 1234    
....    
    ****  
log...  
some other logs...
**** PRINT   
Middle  
....  
.....  
ID = 1234  
.....  
    **** 

继续......其他日志

现在在我的输出文件中,我正在查找**** PRINT****的所有行,以查找我的ID与(ID = 1234)匹配的情况PRINT部分

@echo off  
setlocal EnableDelayedExpansion  
(for /F "delims=" %%a in ('findstr /I /L "**** PRINT" rc_p.20420_09_187.log') do (  
set "line=%%a"  
for /F "delims=<,{}" %%b in ("!line!") do echo %%b  
)) > result.txt  

使用上面的代码,我可以获得**** PRINT,****行,但不能获得两者之间的行。

3 个答案:

答案 0 :(得分:0)

好的,这是一个使用临时目录的尝试:

@echo on
setlocal enabledelayedexpansion
set count=0
set out=0
set var=
md temp
for /f "tokens=*" %%a in (log.txt) do (
 set var=
 set var=%%~a
 if !out!==0 (
  if "!var: =!"=="****PRINT" (
   set /a count+=1
   set out=1
   Echo !var! >> temp\!count!.tmp
  )
 ) else (
  if "!var: =!"=="****" (
   set out=0
   Echo !var! >> temp\!count!.tmp
  ) else (
   Echo !var! >> temp\!count!.tmp
  )
 )
)
for /f "delims=:" %%a in ('findstr /N /R "ID.*1234" "temp\*.tmp"') do type %%a >> output.txt
RMDIR /S /Q temp

要更改目标ID,请编辑文件的这一部分:

for /f "delims=:" %%a in ('findstr /N /R "ID.*1234" "temp\*.tmp"') do type %%a >> output.txt
                                          ^^^^^^^^
                                 Change this number to change ID

使用测试数据创建了一个名为output.txt的新文件,其中包含:

**** PRINT    
Entry   
....   
.....   
ID = 1234     
....     
****   
**** PRINT    
Middle   
....   
.....   
ID = 1234   
.....   
**** 

请注意,如果您的日志文件未命名为log.txt,则可以编辑该文件以搜索您想要的任何名称。

答案 1 :(得分:0)

此批处理文件可以执行您想要的操作:

编辑:我修改了代码,因此ID行中的等号是可选的。

@echo off
setlocal EnableDelayedExpansion

set "IDfound="
set i=0
(for /F "delims=" %%A in (rc_p.20420_09_187.log) do for /F "tokens=1-2 delims== " %%a in ("%%A") do (
   if !i! gtr 0 (
      set /A i+=1
      set "line[!i!]=%%A"
   )
   if "%%a" equ "****" (
      if /I "%%b" equ "PRINT" (
         set i=1
         set "line[1]=%%A"
      ) else if defined IDfound (
         for /L %%i in (1,1,!i!) do echo !line[%%i]!
         echo --------------------------------------
         set "IDfound="
         set i=0
      )
   ) else if /I "%%a %%b" equ "ID 1234" set IDfound=1
)) > result.txt

输出示例:

**** PRINT
Entry
....
.....
ID = 1234
....
    ****
--------------------------------------
**** PRINT
Middle
....
.....
ID = 1234
.....
    ****
--------------------------------------

答案 2 :(得分:0)

这是我JREPL.BAT regular expression text processing utility的完美应用。它是一个混合的JScript /批处理脚本,可以在XP以后的任何Windows机器上本机运行。我建议将脚本放在PATH中列出的文件夹中。我喜欢使用&#34; C:\ utils&#34;对于我所有的非标准实用程序。

使用JREPL.BAT只需一个命令,无需额外的批处理脚本。

第一个版本包含每个块的**** PRINT****行:

jrepl "^\*{4} PRINT\s*?\n(?:[\s\S](?!\*{4}))*\sID = 1234\s[\s\S]*?\*{4}" "$0" /jmatch /m /f rc_p.20420_09_187.log /o result.txt

此第二个版本仅打印**** PRINT****之间的行,并在每个匹配的块之间插入一个空行。

jrepl "^\*{4} PRINT\s*?\n((?:[\s\S](?!\*{4}))*\sID = 1234\s[\s\S]*?)^    \*{4}" "$1" /jmatch /m /f rc_p.20420_09_187.log /o result.txt

您的规范不是很精确 - 可以根据需要调整正则表达式,以获得您正在寻找的精确结果。