有没有办法删除早于某个日期的文件中的所有日志条目? (BASH)

时间:2011-12-06 11:54:42

标签: bash date ubuntu logging

我有一个日志文件,我正在尝试删除早于指定日期的所有条目。虽然我还没有成功。到目前为止我测试的是输入的条目必须比删除的要早,然后像这样循环:

#!/bin/bash

COUNTER=7
DATE=$(date -d "-${COUNTER} days" +%s)
DATE=$(date -d -@${DATE} "+%Y-%m-%d")

while [ -n "$(grep $DATE test.txt)" ]; do

    sed -i "/$DATE/d" test.txt

    COUNTER=$((${COUNTER}+1))
    DATE=$(date -d "-${COUNTER} days" +%s)
    DATE=$(date -d @${DATE} +"%Y-%m-%d")
done

这种工作除非日期不存在日志条目。当它找不到匹配时,它会中止循环,并保留更旧的条目。

更新

这就是我解决它的方法:

#!/bin/bash

COUNTER=$((7+1))
DATE=$(date -d "-${COUNTER} days" +%s)
DATE=$(date -d -@${DATE} "+%Y-%m-%d")

if [ -z "$(grep $DATE test.txt)" ]; then
   exit 1
fi

sed -i "1,/$DATE/d" test.txt

3 个答案:

答案 0 :(得分:1)

根据您的日志文件格式,假设时间戳是文件中的第一列,您可以使用(g)awk执行此操作。

awk 'BEGIN { OneWeekEarlier=strftime("%Y-%m-%d",systime()-7*24*60*60) }
     $1 <= OneWeekEarlier { next }
     1' INPTUTLOG > OUTPUTLOG

这会计算一周前的日期 - 惊喜,惊喜,然后检查第一列(默认情况下为空格分隔的列)是否小于或等于,如果为true,则跳过该行,否则打印。

hard 部分正在使用awk进行“就地”编辑。但它可以做到:

{ rm LOGFILE && awk 'BEGIN { OneWeekEarlier=strftime("%Y-%m-%d",systime()-7*24*60*60) }
     $1 <= OneWeekEarlier { next }
     1' > LOGFILE ; } < LOGFILE

HTH

答案 1 :(得分:1)

很抱歉回答我自己的问题,但我在评论中提到了Martin Frost的建议。这比其他建议容易得多。

这是我的实施:

#!/bin/bash

# requirements for script script

COUNTER=$((7+1))
DATE=$(date -d "-${COUNTER} days" +%s)
DATE=$(date -d -@${DATE} "+%Y-%m-%d")

sed -i "1,/$DATE/d" test.txt

感谢您的帮助!

答案 2 :(得分:1)

我在60天前使用以下代码删除了syslog-ng文件中的日志记录。

#!/bin/bash   

LOGFILE=/var/log/syslog    
DATE=`date +"%b %e" --date="-60days"`    
sed -i "/$DATE/d" $LOGFILE