我正在尝试从输入日志文件中提取特定时间范围内的数据。
输入文件,具有以下模式:
2023-01-31 00:00:21.354 FINE AS2SenderModule: Message sent and response received in 438 millisecondsms
2023-01-31 01:00:21.352 FINE AS2SenderModule: Message sent and response received in 479 millisecondsms
2023-01-31 09:00:23.368 FINE AS2SenderModule: Message sent and response received in 443 millisecondsms
2023-01-31 13:00:24.857 FINE AS2SenderModule: Message sent and response received in 393 millisecondsms
2023-01-31 14:00:26.758 FINE AS2SenderModule: Message sent and response received in 734 millisecondsms
我尝试了以下方法,但都存在某些问题。
set /p start_time=Enter start time (HH:MM:SS):
set /p end_time=Enter end time (HH:MM:SS):
findstr /r "%start_time%.*%end_time%" input.txt > output.txt
这没有用,它返回了一个空的输出文件。
实际上有效的其他解决方法对我没有好处。它不是动态的,需要用户输入,并且只适用于相同的范围模式。如果用户输入像
08:00:00
到 13:00:00
怎么办?
for /f "tokens=11 delims= " %%a in ('findstr " 1[3-4]:[0-5][0-9]:[0-5][0-9] " input.txt ^| findstr /r /c:"millisecondsms"') do @echo %%a>> output.txt
范围可以是
00:00:00
到23:59:59
之间的任何值。
请建议一个方法。
@ECHO OFF
SETLOCAL
:: fixed start/end times for ease of testing
SET "start_time=09:00:23"
SET "end_time=13:00:25"
(
FOR /f "usebackqtokens=1,2,*delims=. " %%g IN ("q75568748.txt") DO IF "%%h" geq "%start_time%" (
IF "%%h" gtr "%end_time%" GOTO done
ECHO %%g %%h.%%i
)
)>"u:\sel.txt"
:done
GOTO :EOF
我使用了适合我的系统的固定时间和文件名。
这一切都围绕着使用 . 和 Space 对每条数据线进行标记。第一个空格之前的部分分配给
%%g
,空格和点之间的部分分配给%%h
,其余部分分配给%%i
(请参阅提示中的for /?
,或有关SO的许多文章以获取文档)
然后测试
%%h
是否大于或等于开始时间,然后再次测试是否大于结束时间,如果时间在结束时间之后则快速退出。