根据创建的时间获取相应的值

时间:2014-08-26 17:09:51

标签: awk

cat input.txt | awk '/ID/;/TimeReceived/ {print $2,$3,$4}'

输出:

ID:    f7a570c2
03/26/14 18:22:50 GMT
ID:    f7f810a2
08/13/14 23:50:59 GMT
ID:    f8e76dd2
04/25/14 06:13:10 GMT
ID:    f92e90c2
03/19/14 12:51:23 GMT
ID:    f98ac152
08/01/14 00:10:43 GMT
ID:    faef4812
04/21/14 16:29:15 GMT
ID:    fb6b38d4
05/06/14 17:32:20 GMT
ID:    fbfb0d92
08/26/14 04:24:07 GMT
ID:    fc15d932
05/27/14 18:44:48 GMT
ID:    fc235e12
06/03/14 12:39:17 GMT
ID:    fc988622
06/23/14 16:02:29 GMT
ID:    fcb1e6c2
03/25/14 17:37:48 GMT
ID:    fd025382
05/28/14 16:50:29 GMT
ID:    fd061b12
04/21/14 18:41:41 GMT
ID:    fd7efde2
08/15/14 18:01:27 GMT
ID:    fdd30022
05/28/14 15:51:29 GMT
ID:    fdf73792
03/31/14 20:13:00 GMT
ID:    fe9d3a22
04/15/14 16:15:37 GMT
ID:    fea03cf2
08/04/14 02:06:00 GMT
ID:    ff7e3de2
07/07/14 10:51:41 GMT

以上输出未按时间排序。我想提取所有创建时间应该是一个月的“ID”。有人可以帮我编码吗?

1 个答案:

答案 0 :(得分:1)

使用GNU awk和GNU date,以下内容应该有效:

awk -vcutoff="$(date -d"-1 month" +%s)" '
/^ID:/ {
    ID=$2
    next
}

/^TimeReceived:/ {
    split($2, d, /\//)
    gsub(/:/, " ", $3)

    tm=mktime("20"d[3]" "d[1]" "d[2]" "$3)

    if (tm<cutoff) {
        print ID
    }
}' input

根据评论中的讨论,有关日期如何计算的一些例子:

$ date -d "03/31/2014 - 1 month"
Mon Mar  3 00:00:00 EST 2014

$ date -d "06/26/2014 - 1 month"
Mon May 26 00:00:00 EDT 2014

date的信息页面在28.6 Relative items in date strings部分中提供了有关这些计算的更多信息。