【问题标题】:Select time intervals from log files using Bash使用 Bash 从日志文件中选择时间间隔
【发布时间】:2010-08-25 22:01:14
【问题描述】:

我需要使用 shell 脚本 (bash) 从日志文件中提取一些信息。日志文件中的一行通常如下所示:

2009-10-02 15:41:13,796| some information

有时,这样的一行后面还有几行提供有关事件的详细信息。这些额外的行没有特定的格式(特别是它们不以时间戳开头)。

我知道如何使用 grep 根据关键字和表达式过滤文件。基本上我遇到的问题是有时我只需要查看特定的时间间隔。例如,我只需要查看最后 X 分钟内发生的事件。我没有使用 shell 脚本的经验,但由于时间格式的复杂性,这对我来说似乎是一项相当困难的任务。另一方面,我可以想象这不是什么不寻常的事情,所以我想知道是否有一些工具可以让我更轻松,或者你是否可以给我一些关于如何解决这个问题的提示?

【问题讨论】:

  • 感谢您的所有回答。不幸的是,服务器不支持很多东西(没有带 %s 参数的日期,没有 phython,systime() 也不起作用)。我现在决定使用 Perl,因为它提供了一些缺少的方便的时间函数。不过,你们的cmets给了我很多有用的提示!

标签: bash file shell logging


【解决方案1】:
gawk -F"[-: ]" 'BEGIN{
  fivemin = 60 * 60 * 5   #last 5 min
  now=systime()
  difference=now - fivemin
}
/^20/{
  yr=$1
  mth=$2
  day=$3
  hr=$4
  min=$5
  sec=$5
  t1=mktime(yr" "mth" "day" "hr" "min" "sec)
  if ( t1 >= difference) {
   print
  }
}' file

【讨论】:

  • @ghostdog74:这似乎无法处理 OP 在其日志文件中的额外信息行。不过我喜欢。
【解决方案2】:

基本上我遇到的问题是有时我需要查看 仅在特定时间间隔。

您可以使用date 通过%s 参数为您转换日期签名:

%s     seconds since 1970-01-01 00:00:00 UTC

我们可以用它做一个小示范:

#!/bin/bash

timespan_seconds=300 # 5 minutes

time_specified=$(date +"%s" -d "2010-08-25 14:54:40")

let time_now=$(date +"%s")
let time_diff=($time_now - $timespan_seconds) 

if [ $time_specified -ge $time_diff ]; then
        echo "Time is within range"
fi

请注意,这并不涉及未来的时间。

【讨论】:

    【解决方案3】:

    您可能想查看my Python program,它根据时间范围从日志文件中提取数据。日期规范尚未实现(它旨在查看大约最近的 24 小时)。它期望的时间格式(例如 Jan 14 04:10:13)看起来与您想要的有点不同,但可以调整。我没有用非时间戳行测试它,但它应该打印指定时间范围内的所有内容。

    这会给你一些使用信息:

    timegrep.py --help 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2015-12-12
      • 2019-05-13
      • 2023-04-03
      • 1970-01-01
      • 2018-10-04
      相关资源
      最近更新 更多