有没有一种方法可以删除文件中所有早于特定日期的日志条目?(BASH)

3

我有一个日志文件,想要删除所有早于指定日期的条目。然而,我还没有成功。到目前为止我尝试的方法是添加一个输入来指定删除哪些早于该日期的条目,然后像这样循环:

#!/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

你应该可以使用 find-mtime 来完成这个任务。 - Bruno
3
我认为他的意思是文件中每一行日志都有相应的日期时间,并且他想从日志文件中删除特定的行。 - Dunes
2
你考虑过使用 logrotate 吗? - OpenSauce
1
如果你要删除的是某种日志文件中的条目,那么可以安全地假设所有条目都附加在文件末尾,并且每个新条目的时间戳大于上一个条目的时间戳。如果是这样,你可能只需要遍历该文件并删除所有条目,直到找到与你所需日期相匹配(或大于)的时间戳。 - Frost
Martin,如果你把你的想法发布为答案,我会将其标记为被接受的答案。它非常有效。 - Niklas
显示剩余3条评论
3个回答

2

非常抱歉自问自答,但我选择了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

感谢您提供的所有帮助!

sed -i "1,/$(date -d "8 day ago" '+%F')/d" test.txt - Sven Gurke
如果没有包含$DATE的行,则此操作可能会删除整个文件。 - qbolec
如果没有包含$DATE的行,这可能会删除整个文件。 - qbolec

1

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

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

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

困难的部分是使用awk进行“原地”编辑。但是它是可以完成的:

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

HTH


谢谢您的回复,但我选择了Martin Frost的建议,使用sed更容易执行此操作。 - Niklas
请看我上面关于你的解决方案的评论! - Zsolt Botykai

1
我使用以下代码删除了60天前的syslog-ng文件中的日志记录。
#!/bin/bash   

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

这似乎只删除创建时间恰好为60天前的日志,而不是那些创建时间为61天或更久以前的日志。 - qbolec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接