我见过很多关于删除超过x小时数的文件的问题。我没有看到任何关于删除超过x小时的文件中的行的任何内容。
以下是我正在处理的日志示例。为了示例,假设当前时间为2016-12-06 06:08:48,594
2016-12-05 00:44:48,194 INFO this line should be deleted
2016-12-05 01:02:10,220 INFO this line should be deleted
2016-12-05 05:59:10,540 INFO this line should be deleted
2016-12-05 06:08:10,220 INFO this line should be deleted
2016-12-05 16:05:30,521 INFO do not delete this line
2016-12-05 22:23:08,623 INFO do not delete this line
2016-12-06 01:06:28,323 INFO do not delete this line
2016-12-06 05:49:55,619 INFO do not delete this line
2016-12-06 06:06:55,419 INFO do not delete this line
我意识到在python或Perl中执行此操作可能更容易,但这需要在bash中完成。话虽如此,请发布任何和所有相关的答案。
到目前为止,我已尝试使用sed,awk等将时间戳转换为秒。
#! /bin/bash
TODAY=$(date +%Y-%m-%d)
# one day ago
YESTERDAY=$(date -d @$(( $(date +"%s") - 86400)) +%Y-%m-%d)
REPORT_LOG=report_log-$TODAY.log
# current date in seconds
NOW=$(date +%s)
# oldest date in the log trimmed by timestamp
OLDEST_DATE=$(head -1 $REPORT_LOG | awk '{print $1" "$2}')
# oldest date converted to seconds
CONVERT_OLDEST_DATE=$(date -d "$OLDEST_DATE" +%s)
TIME_DIFF=$(($NOW-$CONVERT_OLDEST_DATE))
# if difference is less than 24 hours, then...
if [ $TIME_DIFF -ge 86400 ]; then
LATEST_LOG_TIME=$(tail -1 $REPORT_LOG | awk '{print $2}'| cut -c 1-8)
RESULTS=$(awk "/${YESTERDAY} ${LATEST_LOG_TIME}/{i++}i" $REPORT_LOG)
if [ -z $RESULTS]; then
awk "/${YESTERDAY} ${LATEST_LOG_TIME}/{i++}i" $REPORT_LOG > $REPORT_LOG.tmp && mv $REPORT_LOG.tmp $REPORT_LOG
else
echo "Out of ideas at this point"
fi
else
echo "All times newer than date"
fi
我上面的代码片段的问题在于它依赖于重复自身的日期以使awk工作,但情况并非总是如此。日志文件中有一小时的间隙,因此最后一行的日期(例如2016-12-06 06:06:55
)可能是该日期出现的唯一时间。如果之前没有出现时间戳,我的脚本将在匹配的时间戳之前删除所有结果。
感谢任何和所有帮助。
答案 0 :(得分:2)
awk
救援!
$ awk -v d="2016-12-05 06:08:48,594" '($1 " " $2) > d' file
将打印较新的条目。显然,您想要动态创建日期。
忽略要简化的毫秒部分,您可以使用
$ awk -v d="$(date --date="yesterday" "+%Y-%m-%d %H:%m:%S,999")" ...
请注意,词法比较仅适用于您的层次结构格式化日期(为什么不是每个人都使用它?),对于任何其他格式,您最好从epoch转换为秒并对整数进行数值比较
答案 1 :(得分:0)
使用格式字符串+%s
执行自Unix纪元以来的日期。例如:
yesterday=$(date --date="yesterday" +%s)
然后解释您使用awk
或类似内容提取的日期:
dateInUnixEpoch=$(date --date="$whateverDate" +%s)
然后只是比较日期:
if [ "$yesterday" -ge "$dateInUnixEpoch" ];
then do whatever to delete the lines
fi