我看到很多關於刪除超過x小時的文件的問題。我還沒有看到任何有關刪除超過x小時數的文件中的行的任何信息。刪除24小時以前的文件中的所有行
這是我正在處理的日誌的一個例子。對於這個例子的目的,假設當前時間是2016-12-06 06:08:48,594
2016-12-05 00:44:48,194 INFO this line should be deleted
2016-12-05 01:02:10,220 INFO this line should be deleted
2016-12-05 05:59:10,540 INFO this line should be deleted
2016-12-05 06:08:10,220 INFO this line should be deleted
2016-12-05 16:05:30,521 INFO do not delete this line
2016-12-05 22:23:08,623 INFO do not delete this line
2016-12-06 01:06:28,323 INFO do not delete this line
2016-12-06 05:49:55,619 INFO do not delete this line
2016-12-06 06:06:55,419 INFO do not delete this line
我意識到,它可能更容易做到這一點在Python或Perl,但是這需要在bash做。這就是說,請張貼任何和所有相關的答案。
到目前爲止,我試過使用sed,awk等將時間戳轉換爲秒。
#! /bin/bash
TODAY=$(date +%Y-%m-%d)
# one day ago
YESTERDAY=$(date -d @$(($(date +"%s") - 86400)) +%Y-%m-%d)
REPORT_LOG=report_log-$TODAY.log
# current date in seconds
NOW=$(date +%s)
# oldest date in the log trimmed by timestamp
OLDEST_DATE=$(head -1 $REPORT_LOG | awk '{print $1" "$2}')
# oldest date converted to seconds
CONVERT_OLDEST_DATE=$(date -d "$OLDEST_DATE" +%s)
TIME_DIFF=$(($NOW-$CONVERT_OLDEST_DATE))
# if difference is less than 24 hours, then...
if [ $TIME_DIFF -ge 86400 ]; then
LATEST_LOG_TIME=$(tail -1 $REPORT_LOG | awk '{print $2}'| cut -c 1-8)
RESULTS=$(awk "/${YESTERDAY} ${LATEST_LOG_TIME}/{i++}i" $REPORT_LOG)
if [ -z $RESULTS]; then
awk "/${YESTERDAY} ${LATEST_LOG_TIME}/{i++}i" $REPORT_LOG > $REPORT_LOG.tmp && mv $REPORT_LOG.tmp $REPORT_LOG
else
echo "Out of ideas at this point"
fi
else
echo "All times newer than date"
fi
與我上面的代碼中的問題是,它依賴於一個日期重演了awk的工作,這是情況並非總是如此。日誌文件中存在長達一小時的間隔,所以最後一行的日期(例如2016-12-06 06:06:55
)可能是日期出現的唯一時間。如果時間戳先前沒有出現,我的腳本將刪除匹配的時間戳之前的所有結果。
任何和所有的幫助表示讚賞。
爲什麼第4行不能被刪除? – karakfa
@karakfa,你是對的。第4行應該刪除。我忘記了我提供了一個時間假設的例子,並且在日誌中記錄了最新的時間戳。 – Raptor