Rimuovi le linee che corrispondono al file


0

Ho un file che contiene varie date e IP che ho bisogno di fare una pulizia quotidiana di. Il formato del file è:

# 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

Ogni giorno voglio rimuovere qualsiasi riga di commento + l'IP sotto di esso che è più vecchio di 30 giorni. Per questo, posso facilmente fare una variabile bash di "LAST_MONTH = date --date="-30 days" +%Y-%m-%d "e posso ottenere le linee abbastanza facilmente facendo" DELETE = $ (cat / var / www / html / ips | grep $ DATE -A1) ".

Da qui, potrei usare tecnicamente sed per cancellare le righe come "sed -i" s / $ DELETE / test / g "" $ FILE "" ma ci sono i tag hash e le righe multiple coinvolte, quindi non funziona davvero per me proprio adesso.

Cosa consiglieresti come il modo migliore per farlo? Non voglio creare un altro file temporaneo se possibile. Sarei interessato anche alle soluzioni bash e Python.

Grazie.

Risposte:


1

un po 'di pitone: attenzione, sono abbastanza nuovo ad esso.

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

1

richiede la data di GNU e sponge dal pacchetto moreutils per riscrivere nello stesso file

awk -v ago="$(date -d '30 days ago' '+%F %T')" '
    $1 == "#" && $2" "$3 < ago {getline; next}
    {print}
' file | sponge file
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.