如果日期早于30天,则使用bash删除文本文件中的行

时间:2016-07-25 15:15:09

标签: bash awk sed

我有一个看起来像这样的文本文件:

test10 2016-05-30 207
test11 2016-06-01 207
test12 2016-07-20 207
test13 2016-07-21 207
test14 2016-07-25 207

如果该日期超过30天,我想删除文本文件中的行。我怎样才能做到这一点?我已经阅读了一些大概sed,但不确定是否可以这样做或如何去做。

1 个答案:

答案 0 :(得分:6)

关于YYYY-MM-DD的好处是它的alpha排序与它作为日期对象的排序顺序相同 - 所以你可以生成一个表示截止日期的字符串并与之比较。

如果你有GNU日期:

cutoff=$(date -d 'now - 30 days' '+%Y-%m-%d')
awk -v cutoff="$cutoff" '$2 >= cutoff { print }' <in.txt >out.txt && mv out.txt in.txt

也可以依赖GNU awk(gawk)而不是GNU日期:

gawk -v current="$(date +"%Y %m %d %H %M %S")" \
  'BEGIN {
     cutoff_secs = mktime(current) - (60 * 60 * 24 * 30)
   }

   {
     line_secs=mktime(gensub(/-/, " ", "g", $2) " 00 00 00")
     if (line_secs >= cutoff_secs) { print }
   }' <in.txt >out.txt && mv out.txt in.txt

请注意,后一种实施方式是在30天前的当前时间开始,而不是在30天前的当天开始;如果您不想要此行为,请将%H %M %S替换为00 00 00