在 Bash 中按日期和时间过滤


我想在以下日志中获取"Apr 24 10:00:00.000000"

和"Apr 25 24:00:00.999999"之间的数据,但我不确定如何获得这项工作:

files/file1:Apr 22 02:47:00.663117 somedata
files/file1:Apr 23 04:47:00.663127 somedata
files/file1:Apr 24 05:47:00.663137 somedata
files/file1:Apr 24 10:47:00.663137 somedata
files/file1:Apr 25 01:47:00.663147 somedata
files/file1:Apr 25 23:47:00.663157 somedata
files/file1:Apr 25 23:47:00.663167 somedata
files/file1:Apr 26 23:47:00.663177 somedata

我尝试使用以下命令,但这只会按时间过滤,而不会考虑日期:

awk -v start=10:00:00.000000 -v stop=24:00:00.999999 'start <= $3 && $3 <= stop'

我只想获取以下数据:

files/file1:Apr 24 10:47:00.663137 somedata
files/file1:Apr 25 01:47:00.663147 somedata
files/file1:Apr 25 23:47:00.663157 somedata
files/file1:Apr 25 23:47:00.663167 somedata

有人可以帮忙吗?

$ cat get_dates.awk
BEGIN {
    start_t = mktime("2015 04 24 10 0 0")
    end_t = mktime("2015 04 26 0 0 0")
    FS="[:. ]"
    for (i = 1; i <= 12; i++) {
        timestamp = mktime("2015 " i " 1 0 0 0")
        m = strftime("%b", timestamp)
        month[m] = i
    }
}
{
    now = mktime("2015 " month[$2] " " $3 " " $4 " " $5 " " $6)
    if (start_t <= now && now <= end_t) {print}
}

在第一个块中,我们为要查看的时间的开始和结束创建时间戳,并将字段分隔符设置为冒号、空格或点。然后我们创建一个数组,将缩写的 Month 转换为数字。

然后,对于每一行,我们创建一个带有相应字段的新时间戳,如果它介于上面的两个时间戳之间,我们就使用它。

$ awk -f get_dates.awk dates.txt 
files/file1:Apr 24 10:47:00.663137 somedata
files/file1:Apr 25 01:47:00.663147 somedata
files/file1:Apr 25 23:47:00.663157 somedata
files/file1:Apr 25 23:47:00.663167 somedata

相关内容

  • 没有找到相关文章

最新更新