再会。我有一个日志文件,我想删除超过 30 天的行。
文件内容:
2017/04/04 15:53:22 [11487] building file list
2017/04/04 15:53:22 [11487] done
2017/04/04 15:53:22 [11487] sent 163 bytes received 12 bytes 350.00 bytes/sec
2017/04/04 15:53:22 [11487] total size is 48640 speedup is 277.94
2017/04/04 15:53:29 [11493] building file list
2017/04/04 15:53:29 [11493] done
尝试使用 awk,但它不允许您对文件执行内联编辑。也不能使用 gawk 作为解决方案,因为我只有 v 3.7.0 希望有人可以帮助 sed 吗?最好寻找一个衬垫。这是在 bash 中。
答案1
如果您可以确定每天至少有一个条目,您可以说:
sed -n '\|'$(date +'%Y/%m/%d' -d '30 days ago')'|,$p' log
前提是你有 GNU sed
。如果不是,您需要转义日期中的斜杠。
答案2
grep -v "$(date '+%Y/%m/%d' -d '30 days ago')*" logfile
答案3
如果你有perl
:
perl -MPOSIX -ni -e '
BEGIN{$cutoff = strftime("%Y/%m/%d %T", localtime(time - 30*86400))}
print if $_ ge $cutoff' file.log
如果你有 GNU date
:
file=file.log
{
rm -f -- "$file" &&
awk -v "cutoff=$(date -d '30 days ago' '+%Y/%m/%d %T')" '
$0 >= cutoff' > "$file"
} < "$file"
为了清楚起见,两者都在几行上,但如果您需要的话,请随意将 then 放在一行上(在连接变体的行时,您需要在;
和file.log
之间{
使用"$file"
和。}
awk
答案4
使用dateadd
和dategrep
来自日期工具:
dategrep -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile
dateadd
计算从现在到过去 30 天的日期时间。然后dategrep
仅打印 stdin 中包含比该日期字符串更新或等于 ( >=
) 的日期字符串的行。在这种情况下,需要指定日志行的日期格式-i
。