如何使用特定字符串从过去 10 分钟的日志文件中获取行

Posted

技术标签:

【中文标题】如何使用特定字符串从过去 10 分钟的日志文件中获取行【英文标题】:How to get lines from log file from last 10 minutes with specific string 【发布时间】:2020-12-09 10:23:55 【问题描述】:

尝试了其他解决方案但没有给出正确的解决方案我的时间格式是 [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

【问题讨论】:

我在这里将其作为一般评论。虽然您拥有的时间格式很容易阅读,但您现在注意到它非常不切实际。始终尝试使用可排序的时间格式,例如 unix-time,或者如果您想阅读 ISO8601,它会显示为“2020-08-20T09:28:51” 哦,我明白了,您至少可以告诉我如何使用 grep 类似上述日期的句子 [Thu Aug 20 09:23:51 2020]。当我 grep 时,这个 grep 不把它作为单个参数,而是不同的字符串 【参考方案1】:

好吧,我尝试直接使用 grep,但我不知道为什么,但是 grep 没有采用这种日期格式并给出一些错误的输出,所以我做了一些解决方法。

#!/bin/bash
input="/home/babin/Desktop/code2"
count=0

dateyear=$(date +'%Y')
month=$(date +'%b')
day=$(date +'%a')

#do loop for 10 mins from now
for (( i = 0; i <=9; i++ )) ; do
     if grep $(date +%R -d "-$i  min") $input | grep -i "error" | grep -wi "$month" | grep -wi "$year" | grep -wi "$day"
     then
        currentcount=$(grep $(date +%R -d "-$i  min") $input | grep -wi "70007" | grep -wi "$month" | grep -wi "$year" | grep -wic "$day")
     else
        currentcount=0
        echo "not found"
     fi
      count=$(( $count + $currentcount )) 
done
    echo "$count"
  #check no of error found and  do task
 if(( $count >= 10))
    then
    echo "more oe equal to 10 finds"
   else
    echo  "less than 10 occurence"
   fi

它给出的输出是当前时间是 [Thu Aug 20 09:28:51 2020],它也匹配“错误”字符串。

  enter   [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] dadcode here

【讨论】:

tail $input | grep .... $input ? tail 被忽略,你可以删除它。 @KamilCuk 哦,我明白了,谢谢你编辑了你能告诉我为什么供参考【参考方案2】:

整体流程为:

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

一般来说,使用流在 bash 中工作。 strptime 来自 dateutils 包。像这样:

# 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-

不要使用反引号``。 They are discouraged。请改用$(...)。请记住作为经验法则引用所有变量扩展。使用 http://shellcheck.net 检查您的脚本中最常见的错误。我认为在datestrptime 之间的某个地方,您可能会遇到与您的时区有关的问题(即小时数的差异)。

【讨论】:

您的答案是将每个字符串分别由​​ whitesapce 分隔,并导致我有很多应该过滤的行.. 我希望他们将整个日期作为单个字符串。 taking every string seperately seperated by whitesapce 我不知道这是什么意思。我发布的代码只是该流程的一个示例 - 您可以将其全部写入 awk 或任何其他工具。我会添加一些 cmets。

以上是关于如何使用特定字符串从过去 10 分钟的日志文件中获取行的主要内容,如果未能解决你的问题,请参考以下文章

在过去 1 分钟创建的文件中查找特定单词的 Powershell 脚本

如何从 yfinance 获取特定时间和日期的 1 分钟价格数据?

如何在特定时间运行我的代码? [复制]

如何使用 pyspark 从文本日志文件的特定部分创建数据框

如何从每 2 分钟存储的状态日志中确定事件的开始/结束时间

如何从 bash 脚本将消息记录到特定路径中的日志文件