ファイルから一致する行を削除する

ファイルから一致する行を削除する

毎日消去する必要があるさまざまな日付と IP を含むファイルがあります。ファイル形式は次のとおりです。

# 2018-02-21 11:31:37 - user1 - This is a test.
1.1.1.1
# 2018-02-21 11:32:30 - user1 - This is also a test.
2.2.2.2
# 2018-03-06 21:12:44 - user2 - Another comment.
3.3.3.3

毎日、コメント行とその下の 30 日以上前の IP を削除したいと考えています。そのためには、bash 変数「LAST_MONTH= date --date="-30 days" +%Y-%m-%d」を簡単に実行でき、「DELETE=$(cat /var/www/html/ips | grep $DATE -A1)」を実行することで、簡単に行を取得できます。

ここから、技術的には sed を使用して「sed -i "s/$DELETE/test/g" "$FILE"」などの行を消去できますが、ハッシュ タグと複数の行が含まれているため、現時点では実際には機能していません。

これを行うための最善の方法として何をお勧めしますか? 可能であれば、別の一時ファイルを作成したくありません。また、bash と Python の両方のソリューションにも興味があります。

ありがとう。

答え1

some python: 注意、私はかなり初心者です。

import io
import datetime

buffer = io.StringIO()
ago = datetime.date.today() - datetime.timedelta(days=30)
filename = "file"

with open(filename,"r") as f:
    line = f.readline()
    while line:
        if line.startswith("#"):
            date = (line.split())[1]
            if date >= ago.isoformat():
                buffer.write(line)
                line = f.readline()
                buffer.write(line)
        line = f.readline()

with open(filename, "w") as f:
    f.write(buffer.getvalue())

答え2

GNU dateが必要であり、spongemoreutilsパッケージから同じファイルに書き戻す

awk -v ago="$(date -d '30 days ago' '+%F %T')" '
    $1 == "#" && $2" "$3 < ago {getline; next}
    {print}
' file | sponge file

関連情報