在Linux日志文件中进行最近30分钟的输入

时间:2019-03-07 17:28:24

标签: linux bash

请您指导我如何从日志文件中获取最近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

在此非常感谢您的帮助。预先感谢。

2 个答案:

答案 0 :(得分:1)

文件格式非常容易比较。

start=$(date -d "-30 minutes" +'%Y-%m-%d %H:%M:%S')
awk -v s="$start" 's<$0' file.log

答案 1 :(得分:1)

对于大文件而言,最有效的方法是使用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的输出通过管道传递回tac(尽管我个人建议不要这样做,这是令人信服的原因; tac廉价读取一个可以直接跳到末尾的可搜索文件,但是从管道读取它必须将所有内容一直缓存到末尾,然后才能生成任何输出)。