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