我们正在尝试从文件中提取日志,我们需要满足模式的所有条目,并且时间戳在最后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小时的日志。
先谢谢你!! !!
答案 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