【问题标题】:How to accurately grab logs in the past hour from a log file in BASH?如何从 BASH 中的日志文件中准确抓取过去一小时的日志?
【发布时间】:2016-03-08 23:47:55
【问题描述】:

我有一个 cron 作业的日志文件,其中的条目格式为

Mar  8 17:30:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)

我希望能够定期检查日志以查看特定 CRON 作业(每小时运行一次)是否运行。通过 grep 可以轻松找到我想要的日志。

grep name_of_job logfile

但我不确定如何准确地仅获取 过去一小时的日志以查看是否有任何 cron 作业已运行。

我尝试使用 awk 命令来获取最后一小时 based on this post 但我遇到了 awk 问题,因为我的日期戳被分成了多个字段。

【问题讨论】:

    标签: linux bash unix awk


    【解决方案1】:

    您可以在 GNU awk 中执行此操作:

    $ cat tst.awk
    BEGIN {
        FS="[ :]+"
        nowSecs  = systime()
        thisYear = strftime("%Y")
    }
    {
        mthNr = (match("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3
        inSecs = mktime(thisYear" "mthNr" "$2" "$3" "$4" "$5)
    }
    (nowSecs - inSecs) <= 60
    $ awk -f tst.awk file
    

    如果您的输入文件和当前日期可以跨越年份,那么您需要添加一些逻辑来处理它,因为您的输入文件不包含年份。

    【讨论】:

    • 谢谢我已经实现了其他人,因为它有效并且他首先发布,但我喜欢你的回答,喜欢你用长月字符串做的小把戏:)。
    • 谢谢。在尝试使用 shell 循环操作文本之前,您可能需要阅读 unix.stackexchange.com/questions/169716/…
    【解决方案2】:

    wrt 你的问题我已经创建了虚拟日志,还要注意时间是我的时区。我还显示了运行脚本之前的当前时间。

    $ cat file2
    Mar  9 05:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    Mar  9 04:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    Mar  9 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    Mar  5 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    Mar  9 04:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    $ date
    Wed Mar  9 05:40:10 IST 2016
    $ ./script.bash 
    Mar  9 05:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    Mar  9 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
    $
    

    script.bash的内容如下:

    #!/bin/bash
    
    while read -r line || [[ -n "$line" ]]
    do
        log_date_str="$(awk '{print $1" "$2" "$3}' <<< "$line")"
        log_date="$(date -d "$log_date_str" +%s)"
        [[ $(($(date +%s)-$log_date)) -le 3600 ]] && echo "$line"
    done < "file2"
    

    我们从日志文件中获取日期并将其转换为自Unix Epoch 以来经过的秒数,并从命令date +%s 中获取当前日期时间的相同格式注意+%s 是此处的格式。 date -d dateString +%s 可用于将字符串作为日期解析为所需的格式。

    一旦我们有了两个日期,我们只需将其相减,然后找出相差小于 3600 秒(1 小时)的结果;然后我们只打印出日志行。

    您可以传递grep 的输出,而不是将文件名传递给while 循环

    【讨论】:

    • 谢谢,效果很好,你能解释一下“读取时...”行的作用吗?
    • 它逐行读取文件,使用read shell 内置函数,help read 获取更多信息。简而言之,它将文件的每一行读入一个名为line的变量中(成功读取返回0退出代码)或使用[[ -n line]]检查line变量的长度是否不为0(当行不以a结尾时需要换行符(\n),例如:最后一行)
    猜你喜欢
    • 2021-04-08
    • 2022-09-23
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    相关资源
    最近更新 更多