我有一系列日志文件,其中包含时间戳。
Fwiw格式为YYYY-MM-DD HH:MM:SS.sss
(即毫秒粒度但不再进一步)
幸运的是,我可以合理地期望这些时间戳按时间顺序排序并且是唯一的。
但是我遇到的问题是提取落在两个时间戳之间的日志文件部分。
我文件中的第一个时间戳为21:27:57.545
我文件中的最后一个时间戳为21:28:45.631
我正在使用的语法是例如
sed -n '/21:28:10*/,/21:28:22*/p'
这会产生一些奇怪的结果(我确定用户错误)
21:28:10*
的开始时间给出了从21:28:10.043
开始的时间戳(到目前为止,21:28:09.484
已经很好了,所以它从正确的位置开始)
然而,21:28:09*
的开始时间为我提供了从21:28:00.003
结束时间同样奇怪。 21:28:22*
的结束时间产生的时间戳最多包括21:28:20.050
,但是我知道之后的时间戳如下:
2017-05-10 21:28:21.278, 901
2017-05-10 21:28:21.303, 901
2017-05-10 21:28:21.304, 901
2017-05-10 21:28:21.483, 901
2017-05-10 21:28:22.448, 901
因此我想知道这是否与sed如何解释字符串有关 - 它是否为文本?是否有单行方式来做我想做的事情?理想情况下,我可以将开始和结束时间戳指定为与实际数据相同的粒度(即在这种情况下为毫秒)
TIA
答案 0 :(得分:0)
如果你想变得非常疯狂:
#!/bin/bash
T1="$(date -d '2017-05-10 21:28:21' +'%s').300" # your start time
T2="$(date -d '2017-05-10 21:28:21' +'%s').400" # your end time
while read L
do
D="$(echo $L | cut -c1-19)" # assuming line starts with timestamp
T=$(date -d "$D" +'%s')
T="${T}.$(echo $L | cut -c21-23)"
if [ $(echo $T'>'$T1 | bc -l) == 1 ] && [ $(echo $T'<'$T2 | bc -l) == 1 ]
then
echo "HIT: $L"
else
echo "NO!: $L"
fi
done < your_log_file