2016-04-19 3 views
0

現在のログファイルを作成してファイルスペースを監視しています。しかし、7日以上経過したファイルのレコードを削除したい。基づいて、ファイル内の行の削除を満たすUnix - 最初の列の日付が7日より古い行を削除する

例ログファイル多くの援助がそこにX日より古いファイルを削除するためにあります

4/10/2016 0:03:48 Filesystem 6.0G 2.6G 3.1G 47%/
4/11/2016 0:08:59 Filesystem 6.0G 2.6G 3.1G 47%/
4/13/2016 0:06:41 Filesystem 6.0G 2.6G 3.1G 47%/
4/15/2016 0:00:16 Filesystem 6.0G 2.6G 3.1G 47%/
4/16/2016 0:03:46 Filesystem 6.0G 2.6G 3.1G 47%/
4/17/2016 0:07:53 Filesystem 6.0G 2.6G 3.1G 47%/
4/19/2016 0:02:26 Filesystem 6.0G 2.6G 3.1G 47%/

(filesize.log)が、どれも同じ。

私のようなアイデアのカップルを見つけた: あなたは、あなたがこれを行うことができます のawkを呼び出す前に、行は無視されなければならないためにどの日付を計算する場合:https://unix.stackexchange.com/questions/81829/delete-lines-in-a-csv-file-older-than-7-days

から

awk -v cmpdate=20130628 '{line=$0; dateval=$8;FS="/"; $0=dateval; thisdate=$3*10000+$1*100+$2; if (thisdate>cmpdate) print line; FS=" ";}' file 

https://unix.stackexchange.com/questions/81829/delete-lines-in-a-csv-file-older-than-7-days

から
#!/bin/bash 
head -n+2 filesize.log | { 
    while read line ; do 
    tmstmp=$(echo "$line" | awk '{print $8}'); 
    echo "TMSTMP: $tmstmp" "TMDELTA: $(($(date -d "now" +%s) - $(date -d "$tmstmp" +%s)))" "TMWINDOW: $((604800))" 
    [ $(($(date -d "now" +%s) - $(date -d "$tmstmp" +%s))) -lt $((604800)) ] && echo "$line"; 
    done; 

}

Grep/awk greater than date

から

awk 'NF>3{gsub(/-/,"",$NF);if ($NF>d) next}{print $1}' FS="[|@]" d=$(date +%Y%m%d) file 

しかし、再び、これらは私が使用されており、これら言及したスクリプトを実行しようとしたとき、私はエラーになってきているの書式​​と同じ日に、次のされていません。

+0

代替アプローチ:あなたのログファイルを持っていることについて深夜に毎日の回転何を?とにかく24時間ごとに1つのファイルを管理する方がはるかに簡単です。 – xbug

+0

ええ、長いログファイルは解決された問題です。私は[logrotate](http://linux.die.net/man/8/logrotate)を見てください。あなたのシステムはすでにlogrotateを実行していて、その設定を編集するだけで済みます。 –

答えて

0

他のすべてが失敗した場合は、C++を使用します。

#include <iostream> 
#include <string> 
#include <ctime> 
#include <iomanip> 
#include <sstream> 
#include <iterator> 
#include <fstream> 
#include <algorithm> 

class line { 
    std::string data; 
public: 
    friend std::ostream &operator<<(std::ostream &os, line const &l) { return os << l.data; } 

    friend std::istream &operator>>(std::istream &is, line &l) { return std::getline(is, l.data); } 

    bool operator<(time_t target) const { 
     std::istringstream buffer(data); 
     struct tm t; 
     buffer >> std::get_time(&t, "%m/%d/%Y %H:%M:%S"); 
     return mktime(&t) < target; 
    } 
}; 

int main(int argc, char **argv) { 
    std::time_t now = std::time(NULL); 
    struct tm tm = *std::localtime(&now); 

    // For the moment I've hard-coded the number of days ago for the cut-off. 
    // Should probably be configurable. 
    tm.tm_mday -= 7; 

    std::time_t target = mktime(&tm); 

    for (int i = 1; i < argc; i++) { 
     std::ifstream in(argv[1]); 
     std::ofstream out(std::string(argv[1]) + ".trimmed"); 

     std::remove_copy_if(std::istream_iterator<line>(in), std::istream_iterator<line>(), 
      std::ostream_iterator<line>(std::cout, "\n"), 
      [&](line const &l) { return l < target; }); 
    } 
} 
0

まず、あなたの形式でしきい値を作る:

start=`date -d '7 days ago' +'%-m/%-d/%y %-H:%M:%S'` 

もっとそう、あなたが最初の日から任意の時間を含める:

start=`date -d '7 days ago' +'%-m/%-d/%y 0:00:00'` 

>は、>=よりやや効率的です。

start=`date -d '8 days ago' +'%-m/%-d/%y 23:59:59'` 
は(あなたのログを仮定すると、24時間の時間を使用しています。)

が続いて一時ファイルにしたい行を保存するためにawkを使用しています。

awk -v start="$start" '$1$2>start' filesize.log > filesize.last7days.log 

チェックそれは、古いファイルの上書き働いたこと:

mv -f filesize.last7days.log filesize.log