Übereinstimmende Zeilen aus der Datei entfernen

Übereinstimmende Zeilen aus der Datei entfernen

Ich habe eine Datei mit verschiedenen Daten und IPs, die ich täglich bereinigen muss. Das Dateiformat ist:

# 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

Ich möchte täglich alle Kommentarzeilen und die darunter liegende IP-Adresse löschen, die älter als 30 Tage sind. Dafür kann ich ganz einfach eine Bash-Variable von „LAST_MONTH= date --date="-30 days" +%Y-%m-%d“ verwenden und die Zeilen ganz einfach abrufen, indem ich „DELETE=$(cat /var/www/html/ips | grep $DATE -A1)“ eingebe.

Von hier aus könnte ich theoretisch sed verwenden, um die Zeilen wie „sed -i "s/$DELETE/test/g" "$FILE"" zu löschen, aber da Hashtags und mehrere Zeilen beteiligt sind, funktioniert das für mich derzeit nicht wirklich.

Was würden Sie als beste Vorgehensweise empfehlen? Ich möchte möglichst keine weitere temporäre Datei erstellen. Ich wäre auch an Bash- und Python-Lösungen interessiert.

Danke.

Antwort1

etwas Python: Achtung, ich bin ziemlich neu darin.

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())

Antwort2

erfordert GNU-Datum undspongeaus dem moreutils-Paket, um in die gleiche Datei zurückzuschreiben

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

verwandte Informationen