如何读取日志文件的最后x小时

时间:2018-02-06 04:43:22

标签: bash shell sh

我有一个名为" batch.log"的日志文件。如果第3列记录了" F"失败状态它将使用第5列中的名称对该文件进行gzip。我尝试仅拉取日志文件的最后24小时,以便我不会获得重复备份

日志文件示例:

2222  20170723060312  C  3434  /batchprocessing/abc.dat
3333  20170723210057  C  2222 /batchprocessing/mnop.dat
4444  20170724030057  F  2223 /batchprocessing/xyz.dat

代码:

today=`date "+%Y-%m-%d"`
while read -r f1 f2 f3 f4 f5 ; do
    if [ "${f3}" = "F" ] ; then
        gzip -c "${f5}" > /backup/batch_backups/"$(basename "${f5}")"_$today.gz
    else
          echo "No Error!"
    fi
done < batch.log

1 个答案:

答案 0 :(得分:1)

通过一些相对较小的更改,您可以使用today格式说明符将%s转换为 seconds-since-epoch ,然后使用参数扩展进行字符串索引转换你的f2到了自纪元以来几秒钟的日期。然后,所有需要做的就是比较today - logdate < 86400秒。您可以使用数字((... < ...))比较或使用较早的[ ... -lt ... ]比较,但建议使用((...))格式进行数字比较。

完全放弃,你可以这样做:

today=$(date "+%Y-%m-%d")
todaysecs=$(date "+%s")             ## get today in seconds since epoch
while read -r f1 f2 f3 f4 f5 ; do
    f2date="${f2:0:4}-${f2:4:2}-${f2:6:2}"      ## get date part of f2
    f2time="${f2:8:2}:${f2:10:2}:${f2:12:2}"    ## get time part of f2
    logsecs=$(date -d "$f2date $f2time" +%s)    ## get f2 seconds since epoch
    ## require both $f3 = "f" and todaysecs - logsecs) < 86400
    if [ "${f3}" = "F" ] && (((todaysecs - logsecs) < 86400)); then
        gzip -c "${f5}" > /backup/batch_backups/"$(basename "${f5}")"_$today.gz
    else
        echo "No Error!"
    fi
done < batch.log

(避免使用命令替换的反引号而是使用$(cmd)

注意: logsecs可以在一个命令中计算,例如

logsecs=$(date -d "${f2:0:4}-${f2:4:2}-${f2:6:2} ${f2:8:2}:${f2:10:2}:${f2:12:2}" +%s)

仔细看看,如果您有其他问题,请告诉我。