我尝试在我的日志文件中获取最后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'"
这不会给我任何错误,但也没有给我任何结果
非常感谢任何帮助
答案 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}"