如何只输出小于 3 个月的行?

gas*_*ter 4 bash sed awk

cat a.txt
1387111124 ./asfjlasdf.txt
1348681215 ./akdfyxcv.txt
Run Code Online (Sandbox Code Playgroud)

所以我需要这个:

cat a.txt | SOMEMAGIC
1387111124 ./asfjlasdf.txt
Run Code Online (Sandbox Code Playgroud)

输出应仅包含小于 3 个月的行。我怎样才能做到这一点?(第一列总是unix日期,第二列是一些没有空格的字符串)

Sté*_*las 6

或者,如果您date不支持%s,有许多awk实现,您可以使用srand()来获取当前的 Unix 时间:

 awk 'BEGIN{srand(); d = srand() - 3 * 30 * 24 * 60 * 60}; $1 > d' < a.txt
Run Code Online (Sandbox Code Playgroud)

或使用perl

 perl -ne'BEGIN{$d = time - 3 * 30 * 24 * 60 * 60}print if $_ > $d' < a.txt
Run Code Online (Sandbox Code Playgroud)

请注意,此处的 3 个月被视为 90 天的固定时间段,每个时间段为 86400 秒。

如果您想要:不是在一个月的同一天之前,3 个月前的同一天(如果现在是 2013-12-15 21:02:01,那将是自 2013-09-15 21 以来: 02:01(例如在欧盟时区 91 天 1 小时前)),请参阅@Zelda 的回答,或:

 perl -MPOSIX -ne 'BEGIN{@t=localtime;$t[4]-=3;$d=mktime @t}
                   print if $_ > $d' < a.txt
Run Code Online (Sandbox Code Playgroud)

(需要注意的是,5 月 29 日(非闰年)、5 月 30 日和 31 日、7 月 31 日和 12 月 31 日,3 个月前的日期将与 GNU 相同date -d '3 months ago')。

如果相反,您的意思是本月、前一个月或前一个月(如果今天是 2013-12-15,那将是自 2013-10-01 00:00:00),那将是:

 perl -MPOSIX -ne 'BEGIN{@t=localtime;$d=mktime 0,0,0,1,$t[4]-2,$t[5]}
                   print if $_ >= $d' < a.txt
Run Code Online (Sandbox Code Playgroud)