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

Awk 根据创建的时间获取相应的值,awk,Awk,输出: cat input.txt | awk '/ID/;/TimeReceived/ {print $2,$3,$4}' 以上输出不按时间排序。我想提取所有的“ID”,它的创建时间应该超过一个月。有人能帮我编码吗?使用GNUawk和GNUdate以下功能应该可以工作: 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 GM

输出:

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

以上输出不按时间排序。我想提取所有的“ID”,它的创建时间应该超过一个月。有人能帮我编码吗?

使用GNU
awk
和GNU
date
以下功能应该可以工作:

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

date
的信息页面在
28.6
部分中有关于这些计算的更多信息,日期字符串中的相关项不解析cat命令的输出。您可以像这样更改命令
awk'{…}'文件
ID
行和
TimeReceived
行之间的关系是什么?什么,多少行,把他们分开?您的原始文件看起来像什么?原始文件看起来像这样:ID:f7a570c2 TimeReceived:03/26/14 18:22:50 GMT ID:f7f810a2 TimeReceived:08/13/14 23:50:59 GMT ID:f8e76dd2 TimeReceived:04/25/14 06:13:10 GMT实际上我要查找的是什么,根据创建的时间检索“ID”值(正好是一个月前创建的ID)谢谢@glennjackman。我不知道为什么我把
ID
弄得这么复杂,而且我总是搞砸mktime的参数……这里的源代码格式不好,我总是在
MM/DD/yyyyy
DD/MM/yyyyy
之间来回切换。知道
-1个月
的工作原理吗?它会打印cur吗上个月的当月租金日还是打印上个月发生的日期和上个月的天数?今天是8月26日,
date-d“-1 month”
打印7月26日,这很好,但是7月和8月的天数相同,所以我什么都不知道。如果今天是6月26日,它会打印5月26日吗(“提前1个月”或5月27日(“提前6月的天数”)?如果今天是3月30日,它会打印什么?希望它不会打印2月30日,但会打印2月27日或其他什么?1月31日+1个月:结果从2月31日开始,然后与3月3日(或2日,取决于闰)进行核对。因此,它会增加月份,然后调整天数以适应。类似地,“3月30-1个月”=“3月2日”只是表示它按当前月份天数递增/递减的另一种方式,还是有细微差别?等等:“3月30-1个月=3月2日?”“???说不是这样!我刚刚测试了它,你是对的-这很奇怪。谢谢你的解释。是的,这有点不幸。如果你有特定的要求和/或找到其他方法来避免“月”和“年”工作方式的“模糊性”(使用信息页面的术语),使用原始日计数会更好。
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