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

Bash 有没有办法删除文件中早于某个日期的所有日志条目?(猛击),bash,date,ubuntu,logging,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.t

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

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

根据日志文件格式,假设时间戳是文件中的第一列,您可以使用
(g)awk
这样做

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

$1很抱歉回答了我自己的问题,但我在评论中同意了马丁·弗罗斯特的建议。这比其他建议容易得多

这是我的实现:

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

谢谢你的帮助

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

#!/bin/bash   

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

您应该可以使用
find
-mtime
来执行此操作。我认为他的意思是文件中的每个日志行都有一个关联的日期时间,我们希望从日志文件中删除特定的行。您是否考虑过改用
logrotate
呢?如果您要从中删除条目的是某种日志文件,是否可以安全地假设所有条目都附加到文件末尾,并且每个新条目的时间戳都大于最后一个条目?如果是这样的话,您可能只需遍历文件并删除所有条目,直到找到与所需日期匹配(或大于)的时间戳。感谢Martin Frost的建议!我将尝试这种方法!:)感谢您的回复,但我同意Martin Frost的建议,使用sed执行此操作要容易得多。请参阅我上面对您的解决方案的评论!
#!/bin/bash   

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