【问题标题】:Shell Script to extract logs for last 24 hrs用于提取最近 24 小时日志的 Shell 脚本
【发布时间】:2014-07-02 11:17:16
【问题描述】:

我们正在尝试从文件中提取日志,我们需要所有符合模式且时间戳在过去 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 警告 86c9c59c-c362-48d5-bd8c-fb4c8b616f5a 169.179.101.7 CITIKYC_164283 stence.audit.support.impl.AuditUtilsImpl:173 - 重复的 reg 学习,跳过...

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 小时的日志。

在此先感谢...!!

【问题讨论】:

    标签: shell unix awk log-shipping


    【解决方案1】:

    试试这个单线:

    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
    

    【讨论】:

    • 请注意,我的答案中的last 24 hours 精确到秒。
    • @Jidder 我没有测试,但应该可以。你得到了什么错误信息?请定义“不起作用”。
    • 只是没有返回任何东西,我猜它与$1" "$2>=d 有关,因为它是一个数学比较,但您正在使用它来比较字符串?
    • @Jidder 如果格式为yyyy-mm-dd HH:MM:SS,它也适用于字符串。好的,我做一个测试,也许我错过了什么。
    • 不管它是否有效,我的错误,我离开了&&/YourSearch/这显然没有匹配。至少我学到了一些关于匹配字符串的知识:)
    【解决方案2】:

    完整的 awk。
    这应该可行。
    转换为纪元,然后在纪元中针对当前时间进行测试,精确到秒。

    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
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 2018-12-12
      • 2015-10-18
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多