Shell脚本提取最近24小时的日志

时间:2014-07-02 11:17:16

标签: shell unix awk log-shipping

我们正在尝试从文件中提取日志,我们需要满足模式的所有条目,并且时间戳在最后24小时内。

我的日志看起来像这样:

2014-07-01 01:15:59,486 WARN 86c9c59c-c362-48d5-bd8c-fb4c8b616f5a 169.179.101.7 CITIKYC_164283 stence.audit.support.impl.AuditUtilsImpl:274 - 审计更新  是成功的

2014-07-01 01:15:59,487 WARN 86c9c59c-c362-48d5-bd8c-fb4c8b616f5a 169.179.101.7 CITIKYC_164283 stence.audit.support.impl.AuditUtilsImpl:173 - 重复注册 istration,skipping ...

2014-07-01 01:15:59,488 Blah Blah ..

到目前为止,我们得到了前一天的日志

D=$(date +"%Y-%m-%d" -d "-1 days")
cat citikyc.log | awk '/'$D' /, /'$D' / { print $0 }' | grep "Exception\|at.*\.java\:.*" | mail -s "TESTING" xxx@yyy.com

请帮我们提取最近24小时的日志。

先谢谢你!! !!

2 个答案:

答案 0 :(得分:2)

试试这个单行:

awk -v d="$(date -d'24 hours ago' +'%F %T,000')" '$1" "$2>=d &&/YourSearch/' log

我没有测试,我希望没有错字。

date -d'24 hours ago' +'%F %T,000'将在24小时之前为您提供当前的时间戳。

YourSearch是您的搜索模式(正则表达式)。

添加测试以显示其工作原理:

#this is my current time
kent$  date +'%F %T'
2014-07-02 15:27:46

#file content, so only last 3 lines are in "last 24 hours"
kent$  cat f
2014-06-01 01:15:59,123 foo
2014-07-01 02:15:59,123 bar bar bar
2014-07-01 01:15:59,123 foo
2014-07-01 02:15:59,123 foo
2014-07-01 03:15:59,123 foo
2014-07-01 21:15:59,123 foo
2014-07-01 22:15:59,123 foo
2014-07-01 23:15:59,123 foo

#let's get them
kent$  awk -v d="$(date -d'24 hours ago' +'%F %T,000')" '$1" "$2>=d &&/foo/' f
2014-07-01 21:15:59,123 foo
2014-07-01 22:15:59,123 foo
2014-07-01 23:15:59,123 foo

答案 1 :(得分:0)

全awk。
这应该工作。
转换为epoch然后在epoch中对当前时间进行测试,这精确到秒。

awk 'NF&&/yoursearch/{split($1,d,"-");split($2,t,":");epoch = mktime(d[1]" "d[2]" "d[3]" "t[1]" "t[2]" "t[3])}(systime()-epoch)<86400{print} ' log