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

Bash 如何读取日志文件的最后x小时,bash,shell,sh,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 /batchpr

我有一个名为“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”`
读取时-r f1 f2 f3 f4 f5;做
如果[“${f3}”=“F”];然后
gzip-c“${f5}>/backup/batch_backups/”$(basename“${f5}”)”$today.gz
其他的
回声“没有错误!”
fi
完成
通过一些相对较小的更改,您可以使用
%s
格式说明符,然后使用字符串索引的参数展开,将
f2
转换为以秒为单位的日期(从纪元开始)。然后需要做的就是比较
今天-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

仔细检查一下,如果您还有其他问题,请告诉我。

@David-C-Rankin谢谢您的详细建议!您是否有在Solaris中执行此操作的类似示例?我的版本没有
date-d
选项,所以我得到了这个错误
date:非法选项--d用法:date[-u]mmddHHMM[[cc]yy][.SS]date[-u][+format]date-a[-]sss[.fff
看来我唯一的
date
选择是
u或a
再次感谢你的建议!!!哦哦……让我深入了解一下Solaris的功能。由于从纪元算起的秒数是尼克斯计时的基础,毫无疑问是有办法的,但作为一个Solaris noob,我不得不做一些探索。@FrankRobertson-lo像Solaris和SunOS这样的OK只有
-a
-u
选项。这使得您需要手动计算每个日志条目的秒数。这还不算太糟,只是一个会计问题,即自1970年1月1日以来,将分开的年、月、日和时间中的秒数相加。(这类似于
$(${f2:0:4})-1970)*86400*365))
来计算年差的秒数,然后继续计算。将所有部分相加将得到总秒数。(当然
日期-d
要简单得多
:)
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
logsecs=$(date -d "${f2:0:4}-${f2:4:2}-${f2:6:2} ${f2:8:2}:${f2:10:2}:${f2:12:2}" +%s)