我有一个名为" 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
答案 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)
仔细看看,如果您有其他问题,请告诉我。