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 undsponge
aus 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