首页 > 解决方案 > 如何使用特定字符串从过去 10 分钟的日志文件中获取行

问题描述

尝试了其他解决方案但没有给出正确的解决方案我的时间格式是 [Thu Aug 20 09:28:51 2020]。最接近的是这个

  awk -vDate=`date -d'now-2 hours' +[%a %b %d %H:%M:%S %Y]` '$4 > Date {print Date, $0}' $input

我的日志文件是这样的

 [Thu Aug 20 09:10:51 2020] [error] vendor
 [Thu Aug 20 09:23:51 2020] [error] vendor
 [Thu Aug 20 09:25:51 2020] [error] vendor
 [Thu Aug 20 09:27:51 2020] [error] vendor
 [Thu Aug 20 09:28:51 2020] [error] dad

我想要从当前时间 [Thu Aug 20 09:28:51 2020] 到持续 10 分钟的结果

  [Thu Aug 20 09:23:51 2020] [error] vendor
 [Thu Aug 20 09:25:51 2020] [error] vendor
 [Thu Aug 20 09:27:51 2020] [error] vendor
 [Thu Aug 20 09:28:51 2020] [error] dad

标签: shellawksedgrepsh

解决方案


整体流程为:

  1. 预处理输入以提取日期部分
  2. 将日期转换为自纪元以来的秒数
  3. 根据给定的条件过滤自纪元以来的秒数
  4. 删除自纪元以来的秒数。
  5. 输出。

作为总体规则,使用流在 bash 中工作。来自包装strptimedateutils像这样:

# Extract the date+time part from within [..] and put it on the first column with tab
sed 's/ \[\([^]]*\)\]/\1\t&/' "$input" |
# For each line
while IFS=$'\t' read -r date rest; do
    # Convert the date to seconds since epoch
    date=$(strptime -f "%s" -i "%a %b %d %H:%M:%S %Y" "$date")
    # Output the updated line
    printf "%s\t%s\n" "$date" "$rest"
done |
# Read it all in awk and compare second since epoch in the first field to given value
awk -v "since=$(date -d'now -2 hours' +%s)" '$1 > since' |
# Remove first field - ie. second since epoch
cut -f2-

不要使用反引号``。他们气馁。改为使用$(...)。请记住作为经验法则引用所有变量扩展。使用http://shellcheck.net检查您的脚本中最常见的错误。我认为介于两者之间datestrptime您可能会遇到时区问题(即小时数差异)。


推荐阅读