2016-12-07 5 views
0

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で実行する必要があります。それが言われている、すべての関連する回答を投稿してください。

これまでのところ、Iveは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は、のために自分自身を繰り返して、日付に依存しているということです。ログファイルには1時間の長いギャップがあるため、最後の行の日付(例:2016-12-06 06:06:55)だけが日付が表示される可能性があります。タイムスタンプが以前に表示されていない場合、スクリプトは一致したタイムスタンプより前のすべての結果を削除します。

何かすべての助けがありがとうございます。

+0

なぜ4行目は削除されないのですか? – karakfa

+0

@karakfa、あなたは正しいです。 4行目は削除する必要があります。私は時間の仮定の例を提供し、ログ内の最新のタイムスタンプから離れることを忘れていました。 – Raptor

答えて

2

awkに救助!

$ awk -v d="2016-12-05 06:08:48,594" '($1 " " $2) > d' file 

新しいエントリが印刷されます。明らかに、日付を動的に作成する必要があります。単純化するためにミリ秒の部分を無視

、あなたは字句の比較だけで、あなたの階層フォーマットされた日付のために働くことを

$ awk -v d="$(date --date="yesterday" "+%Y-%m-%d %H:%m:%S,999")" ... 

注意を(なぜ誰もがこれを使用していない?)を使用することができ、他のフォーマットのためにあなたが優れていますエポックから秒に変換し、整数の数値比較を行う

+0

これは、あなたがawkに使用している日付がログファイルにあると仮定していませんか?正確な日付$(date --date = "yesterday" ...)に一致するものがなければ、ファイル内のすべての行を出力します。 – Raptor

+1

いいえ、それは等価チェックではありません。 – karakfa

0

フォーマット文字列+%sを使用して、Unixエポックからの時間を行います。そして、あなたがawkまたは類似などで抽出してきた日付解釈

yesterday=$(date --date="yesterday" +%s)

:例えば

dateInUnixEpoch=$(date --date="$whateverDate" +%s)

をそれからちょうど日付を比較:

if [ "$yesterday" -ge "$dateInUnixEpoch" ]; 
    then do whatever to delete the lines 
fi 
関連する問題