就地删除带有旧时间戳的日志行

就地删除带有旧时间戳的日志行

再会。我有一个日志文件,我想删除超过 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

使用dateadddategrep来自日期工具

dategrep  -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile

dateadd计算从现在到过去 30 天的日期时间。然后dategrep仅打印 stdin 中包含比该日期字符串更新或等于 ( >=) 的日期字符串的行。在这种情况下,需要指定日志行的日期格式-i

相关内容