2016-12-07 87 views
0

我看到很多关于删除超过x小时的文件的问题。我还没有看到任何有关删除超过x小时数的文件中的行的任何信息。删除24小时以前的文件中的所有行

这是我正在处理的日志的一个例子。对于这个例子的目的,假设当前时间是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

为什么第4行不能被删除? – karakfa

+0

@karakfa,你是对的。第4行应该删除。我忘记了我提供了一个时间假设的例子,并且在日志中记录了最新的时间戳。 – Raptor

回答

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")" ... 

注意词汇对比仅适用于您的hierarchial格式的日期(为什么不是每个人都用这个?),对任何其他格式,你最好关闭从时代转换为秒,并对整数进行数字比较

+0

这不是假设您用于awk的日期将在日志文件中吗?如果确切日期$(日期 - 日期=“昨天”...)没有匹配,则它将打印文件中的所有行。 – Raptor

+1

不,这不是平等检查。 – karakfa

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 
相关问题