2017-04-19 18 views
0

我试图让我的日志文件中的最后X分钟日志,然后搜索搜索字符串,如果一个例外出现在这些日志获得最后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=""> 

我的问题是,字符串和所需时n为传递作为参数的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'" 

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

任何帮助,非常感谢

+0

如果它没有成为一个内胆,你可以用两行来避免复杂的引用:'datestart = $(date --date =“$ logTracebackInterval minutes ago”'+%Y-%m-%d%H:%M')'后面跟着sed -n“/^$ {datestart} /,\ $ p”' –

+0

@MarkPlotnik,我知道这是解析变量的问题,但是可以在一行中做到这一点,这将是最好的 –

回答

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 
+0

我知道这个变量不是在一个单引号内引用的,只是没有'''在'''内'',因为我觉得中间部分不会被正确执行,那么我知道这很容易。非常感谢 –

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} 

但是如果t这里是你的确切日期没有行

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}" 
+0

我正在使用的sed命令给了我过去10分钟间隔的日志,而不是确切的一分钟。无论如何,我只是想要一种方法来解决变量,因为除了该命令工作正常,我搜索的文件已被修改为仅10分钟的时间间隔。 –