【问题标题】:How to delete lines in log file older than 14 days?如何删除日志文件中超过 14 天的行?
【发布时间】:2018-09-18 04:21:05
【问题描述】:

我有一个如下所示的日志:

2018-09-18 03:29:38 [info]: /up request - ip: 63.143.42.249
2018-09-18 03:34:38 [info]: /up request - ip: 63.143.42.249 
2018-09-18 03:39:38 [info]: /up request - ip: 63.143.42.249 

我正在尝试使用 bash 或其他脚本语言来删除所有超过 14 天的行。有人对如何做到这一点有建议吗?我看过 GNU awk,但这些示例并不是最容易运行且仍然可读的。

【问题讨论】:

  • 最好使用logrotate。
  • 嗯,为什么不能加gawk标签?
  • @JamesBrown gawkawk 的同义词

标签: bash logging awk


【解决方案1】:
$ cat file
1818-09-18 03:29:38 [info]: /up request - ip: 63.143.42.249
2018-09-18 03:34:38 [info]: /up request - ip: 63.143.42.249 

使用 GNU awk 和 mktime():

$ awk '
BEGIN { 
    now=systime()        # now in epoch time
    fn=60*60*24*14       # fortnight in seconds
}
{
    dt=$1 " " $2         # create datetime
    gsub(/[:-]/," ",dt)  # replace - and : with space for mktime() (see doc above)
}
mktime(dt)>now-fn        
' file

输出:

2018-09-18 03:34:38 [info]: /up request - ip: 63.143.42.249 

答应你把我救你的时间花在学习 awk 上。

【讨论】:

    【解决方案2】:

    我会使用awkdate

    awk -v d="$(date -d "14 days ago" "+%F%T")" '$1 $2 > d' file
    

    或者,为了提高可读性

    fortnight="$(date -d "14 days ago" "+%F%T")"
    awk -v d="$fortnight" '$1 $2 > d' file
    # or, depending on your taste
    awk  '$1 $2 > d'  d="$fortnight"  file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-27
      • 2022-08-03
      • 2011-07-30
      • 2016-09-20
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多