2014-09-02 70 views
-2

我从输入文件获得以下信息。
使用下面的awk命令我已经提取了所有的ID,但我只需要具有相应的时间创建30天以上的ID。
我的意思是,今天是2014年9月2日。
我需要打印30天前或更早创建的所有ID。awk根据排序日期输出值

awk '{print $1}' input.txt 

424a5982-9e18-7571-1d0a-e2ca62f9ba99  04/10/14 17:21:08 
bbe9c5e2-9efa-7571-1140-eabe581b4a50  04/10/14 20:03:16 
3ef42012-9e0c-7571-0673-a293c5b4b23a  04/10/14 17:12:33 
5e214312-c593-7571-0cc9-e09b3d2c23c2  04/15/14 17:56:05 
6f2324f2-c505-7571-0291-c59240866216  04/15/14 16:14:29 
fe9d3a22-c506-7571-1efc-be8e4a2e7a58  04/15/14 16:15:37 
fbcd7512-e205-7575-0061-ba76ec55e4db  08/27/14 16:19:11 
aeba1362-e9b6-7575-08ed-bbfce30fbaff  08/28/14 15:48:26 
f0eb63d2-e9b9-7575-14b6-af2f9d1b8f8b  08/28/14 15:50:45 
271417a2-0ead-7576-13a3-a3e07896ef01  09/02/14 08:41:57 
51505382-45d8-7573-10b0-f253593051b4  06/03/14 15:34:12 
86bc1162-aa70-7573-0bc1-d4599ef344c0  06/16/14 10:48:22 
acbd0942-0eb5-7576-0097-f139dd859f4c  09/02/14 08:48:03 
c06f1552-4237-7575-1ec9-a5e09355f701  08/07/14 08:14:31 
c60d6202-bb49-7571-1c26-c87e822b9075  04/14/14 11:45:24 
d8be5b52-bbeb-7571-08cf-826a5aa63894  04/14/14 12:26:56 
99e70ee2-2e9c-7571-0eed-eece01cdb38c  03/27/14 12:51:39 
+0

你的日期总是比2000年1月1日更新吗?由于你的年份是YY而不是YYYY格式,所以你需要确定它是在哪个世纪。 – 2014-09-02 13:25:40

回答

1

你可能想是这样的,使用GNU AWK时间功能:

$ gawk -F'[[:space:]/:]+' 'mktime("20"$4" "$2" "$3" "$5" "$6" "$7) < (systime() - 30*24*60*60)' file 
424a5982-9e18-7571-1d0a-e2ca62f9ba99  04/10/14 17:21:08 
bbe9c5e2-9efa-7571-1140-eabe581b4a50  04/10/14 20:03:16 
3ef42012-9e0c-7571-0673-a293c5b4b23a  04/10/14 17:12:33 
5e214312-c593-7571-0cc9-e09b3d2c23c2  04/15/14 17:56:05 
6f2324f2-c505-7571-0291-c59240866216  04/15/14 16:14:29 
fe9d3a22-c506-7571-1efc-be8e4a2e7a58  04/15/14 16:15:37 
51505382-45d8-7573-10b0-f253593051b4  06/03/14 15:34:12 
86bc1162-aa70-7573-0bc1-d4599ef344c0  06/16/14 10:48:22 
c60d6202-bb49-7571-1c26-c87e822b9075  04/14/14 11:45:24 
d8be5b52-bbeb-7571-08cf-826a5aa63894  04/14/14 12:26:56 
99e70ee2-2e9c-7571-0eed-eece01cdb38c  03/27/14 12:51:39 

需要注意的是,使用30 *在一天的秒数,并将其与当前的日期+时间到第二,所以它在日期+时间而不是日期上工作。如果这不是你想要的,想一想,阅读gawk手册页,尝试自己修改它(提示用特定的TOD替换输入中的时间,并在相同TOD的今天使用mktime),然后返回你有特定的问题。

+1

非常感谢,能否请你帮我理解这个工作原理mktime(“20”$ 4“”$ 2“”$ 3“”$ 5“”$ 6“”$ 7) – user3834663 2014-09-02 17:08:33

+0

当然,请参见http://www.gnu.org/software /gawk/manual/gawk.html#Time-Functions。如果你要做更多的文本处理,你应该得到Arnold Robbins编写的第三版Effective Awk Programming。 – 2014-09-02 17:12:14

+0

感谢您的链接。我对mktime和systime函数的工作原理有了一些了解。但在这种情况下,我有点难以理解这个'mktime(“20”$ 4“”$ 2“”$ 3“”$ 5“”$ 6“”$ 7)<(systime() - 30 * 24 * 60 * 60 – user3834663 2014-09-03 16:13:24

0

可以使用SYSTIME()和strftime()函数AWK得到时间戳在30天前,并与第二和第三个字段进行比较。

最合适的方法可以是:

  1. 获取的格式YYYY-MM-DD HH 30天前的日期和时间:MM:SS [使用SYSTIME()和strftime()函数]
  2. 将第二个字段设置为YYYY-MM-DD格式[使用substr()函数]
  3. 将每个时间戳记(新的第二个字段和第三个字段)与30天前的时间戳[String comparison] 。

此致

Pd积:在 “YYYY-MM-DD HH:MM:SS” 时间戳格式(或任何其它类似的)是非常适合的时间戳比较时只字符串校验功能是可用的。

+0

我觉得很难对它进行编码。如果您知道请编码并让我知道输出。 – user3834663 2014-09-02 11:50:08

+0

是的,user3834663,代码是你唯一想找的东西。 – Jdamian 2014-09-04 05:32:41