我有一个以下模式的日志输入文件我试图在特定时间范围内提取数据
输入文件数据为
2023-01-31 00:00:21.354 FINE AS2SenderModule:在 438 毫秒内发送消息和接收响应
2023-01-31 01:00:21.352 FINE AS2SenderModule:在 479 毫秒内发送消息和接收响应
2023-01-31 09:00:23.368 FINE AS2SenderModule:在 443 毫秒内发送消息和接收响应
2023-01-31 13:00:24.857 FINE AS2SenderModule:在 393 毫秒内发送消息和接收响应
2023-01-31 14:00:26.758 FINE AS2SenderModule:在 734 毫秒内发送消息和接收响应
我尝试了以下几种方法,但都存在某些问题
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
是否大于或等于开始时间,然后再次测试是否大于结束时间,如果时间在结束时间之后则快速退出。