我有一个输入文件 - >
启动日志文件
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,****行,但不能获得两者之间的行。
答案 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
您的规范不是很精确 - 可以根据需要调整正则表达式,以获得您正在寻找的精确结果。