我有一个日志文件,我正在尝试删除早于指定日期的所有条目。虽然我还没有成功。到目前为止我测试的是输入的条目必须比删除的要早,然后像这样循环:
#!/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
答案 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