获取最后X分钟日志并在文件中搜索字符串

时间:2017-04-19 10:29:37

标签: bash date unix sed grep

我尝试在我的日志文件中获取最后x分钟的日志,然后搜索这些日志中是否存在异常

目前,如果我有固定的分钟间隔和固定的字符串,我可以在以下载人中获得结果

sed -n "/^$(date --date='10 minutes ago' '+%Y-%m-%d %H:%M')/,\$p" filename| grep m1 'ErrorCode="javax.naming.NameNotFoundException"'

我的日志看起来像

    2017-04-19 10:01:35,047 529025829 ERROR [server.YCPSchedulableTrigger] 
(Timer-0:) Exception sending message... 
    2017-04-19 10:01:35,048 529025830 ERROR [server.YCPSchedulableTrigger] 
(Timer-0:) [1492596095048]Error_description_not_available 2017-04-19 10:01:35,049 529025831 ERRORDTL [server.YCPSchedulableTrigger] (Timer-0:) 
[1492596095048]<?xml version="1.0" encoding="UTF-8"?> <Errors>

        <Error ErrorCode="javax.naming.NameNotFoundException"

            ErrorDescription="Error_description_not_available" ErrorRelatedMoreInfo="">

我的问题是字符串和持续时间作为参数传递给bash脚本,当我运行时

 sed -n "/^$(date --date='$logTracebackInterval minutes ago' '+%Y-%m-%d %H:%M')/,\$p" $file| grep -m1 "'$searchString'"

我收到错误

invalid date `$logTracebackInterval minutes ago'

我真正理解,因为$logTracebackInterval是单引号而不是解析

我也试过

sed -n `/^date --date='$logTracebackInterval minutes ago' '+%Y-%m-%d %H:%M'/`,\$p $file| grep -m1 "'$searchString'"

这不会给我任何错误,但也没有给我任何结果

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

单引号可以抑制变量替换。例如:

five=5
echo $(date -d '$five minutes ago')
date: invalid date ‘$five minutes ago’

您需要说出类似的内容:

echo $(date -d "$five minutes ago")

特别是:

sed "/$(date -d "$five minutes ago")/p" file

答案 1 :(得分:0)

sed也可以grep(m1)你的结果

sed "/^$(date --date="10 minutes ago" '+%Y-%m-%d %H:%M')/,\$p!d" -e ' /ErrorCode="javax.naming.NameNotFoundException"/!d" -e 'q' "${file}

但是如果没有确切日期的行

,这将失败 在这种情况下,

awk是一个更好的工具

awk -v T="$(date --date="10 minutes ago" '+%Y-%m-%d %H:%M')" '
   # catch date and hour (could be better but enough for the need)
   BEGIN { split( T, aT);d=aT[1];h=aT[2]}

   # hoppefully, date format is string comparable order in your log
   # ignore earlier line
   $1$2 < d t { next }

   # exit after first occurance print
   /ErrorCode="javax.naming.NameNotFoundException"/ { print; exit }
   ' "${file}"

单线版

awk -v T="$(date --date="10 minutes ago" '+%Y-%m-%d %H:%M')" 'BEGIN{split(T,aT);d=aT[1];h=aT[2]};$1$2<d t{next};/ErrorCode="javax.naming.NameNotFoundException"/{print;exit}' "${file}"