我有一个看起来像这样的文本文件:
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
,但不确定是否可以这样做或如何去做。
答案 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
。