按bash中的日期和时间过滤

时间:2015-05-01 03:15:20

标签: bash unix

我想在" 4月24日10:00:00.000000"之间取数据。和" 4月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

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

$ 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