從檔案中刪除符合的行

從檔案中刪除符合的行

我有一個文件,其中包含我需要每天清除的各種日期和 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。為此,我可以輕鬆地執行“LAST_MONTH= date --date="-30 days" +%Y-%m-%d”的 bash 變量,並且可以通過執行“DELETE=$(cat /var/www/html/ips | grep $DATE -A1)”輕鬆獲得這些行。

從這裡開始,我可以在技術上使用sed 擦除諸如“sed -i”s/$DELETE/test/g““$FILE””之類的行,但是涉及哈希標籤和多行,所以它對我來說並不真正有用現在。

您建議最好的方法是什麼?如果可能的話,我不想建立另一個臨時檔案。我對 bash 和 Python 解決方案也感興趣。

謝謝。

答案1

一些 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 日期,並且sponge從 moreutils 包寫回同一個文件

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

相關內容