Eliminar líneas que coincidan del archivo

Eliminar líneas que coincidan del archivo

Tengo un archivo que contiene varias fechas e IP de las que necesito realizar una purga diaria. El formato del archivo es:

# 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

Diariamente quiero eliminar cualquier línea de comentario + la IP debajo que tenga más de 30 días. Para eso, puedo hacer fácilmente una variable bash de "LAST_MONTH= date --date="-30 days" +%Y-%m-%d" y puedo obtener las líneas con bastante facilidad haciendo "DELETE=$(cat /var/www/html/ips | grep $DATE -A1)".

Desde aquí, técnicamente podría usar sed para borrar líneas como "sed -i "s/$DELETE/test/g" "$FILE"" pero hay etiquetas hash y varias líneas involucradas, por lo que realmente no funciona para mí. ahora mismo.

¿Cuál recomendarías como la mejor manera de hacer esto? No quiero crear otro archivo temporal si es posible. También me interesarían las soluciones bash y Python.

Gracias.

Respuesta1

algo de Python: advertencia, soy bastante nuevo en esto.

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

Respuesta2

requiere fecha GNU, yspongedel paquete moreutils para volver a escribir en el mismo archivo

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

información relacionada