代码之家  ›  专栏  ›  技术社区  ›  Azmy

获取Linux日志文件中的最后30分钟条目

  •  -1
  • Azmy  · 技术社区  · 7 年前

    你能指导我如何从日志文件中获取最近30分钟的条目吗?我试过下面的,但没用。

    sed '/$(date -d "-30 minutes" +'%Y-%m-%d %H:%M')/,/$(date +'%Y-%m-%d %H:%M')/! d' Time_Taken_log.log
    

    pfb日志文件中的条目示例

    2019-03-07 15:32:01.425: 1012
    2019-03-07 15:32:01.456: 886
    2019-03-07 15:32:01.484: 729
    2019-03-07 15:32:01.505: 747
    2019-03-07 15:32:01.527: 716
    2019-03-07 15:32:01.529: 919
    2019-03-07 15:32:01.531: 917
    2019-03-07 15:32:01.584: 964
    2019-03-07 15:32:01.599: 791
    2019-03-07 15:32:01.637: 836
    

    非常感谢你的帮助。提前谢谢。

    0 回复  |  直到 7 年前
        1
  •  1
  •   Cyrus    7 年前

    你的文件格式很好,便于比较。

    start=$(date -d "-30 minutes" +'%Y-%m-%d %H:%M:%S')
    awk -v s="$start" 's<$0' file.log
    
        2
  •  1
  •   Charles Duffy    7 年前

    对于大型文件,最有效的方法是使用 tac 从头到尾读,当你看到一个比你的目标更老的约会时就停下:

    awk -F: -v stop_when_before="$(date +'%Y-%m-%d %H:%M:%S' -d '-30 minutes')" '
      $1 < stop_when_before { exit }
      1 { print }
    ' < <(tac Time_Taken_log.log)
    

    如果只关心50MB的最新内容,就没有理由读取20GB文件的第一个19.95GB。

    如果希望内容按原始顺序排列,请将 awk 回到 塔克 (尽管我个人认为这是没有说服力的理由的; 塔克 读取一个看起来可以直接跳到结尾的文件是非常便宜的,但从管道读取时,它必须将所有内容缓冲到结尾,然后才能生成任何输出)。