我有一系列日志文件,其中包含时间戳等。
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 如何解释字符串有关 - 它是文本吗?有没有一种单线方法来做我想做的事情?理想情况下,我将能够将开始和结束时间戳指定为与实际数据相同的粒度(即在本例中为毫秒)
蒂亚
你应该使用.*
而不是*
。
RE21:28:10*
将匹配以21:28:1
开头的字符串,后跟零个或多个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