具有时间戳边界的日志文件的 Sed 提取部分



我有一系列日志文件,其中包含时间戳等。

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

最新更新