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

时间:2017-05-12 14:14:55

标签: regex bash 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如何解释字符串有关 - 它是否为文本?是否有单行方式来做我想做的事情?理想情况下,我可以将开始和结束时间戳指定为与实际数据相同的粒度(即在这种情况下为毫秒)

TIA

1 个答案:

答案 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