Remover linhas que correspondem ao arquivo

0

Eu tenho um arquivo que contém várias datas e IPs dos quais preciso fazer uma limpeza diária. O formato do arquivo é:

# 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, desejo remover qualquer linha de comentário + o IP abaixo dela que tenha mais de 30 dias. Para isso, posso facilmente fazer uma variável bash de "LAST_MONTH = date --date="-30 days" +%Y-%m-%d " e posso obter as linhas facilmente fazendo "DELETE = $ (cat / var / www / html / ips | grep $ DATE -A1)" .

A partir daqui, tecnicamente eu poderia usar o sed para acabar com as linhas como "sed -i" / $ DELETE / test / g "" $ FILE "" mas há hash tags e várias linhas envolvidas, então não é realmente trabalhando para mim agora.

O que você recomendaria como a melhor maneira de fazer isso? Eu não quero criar outro arquivo temporário, se possível. Eu também estaria interessado nas soluções bash e Python.

Obrigado.

    
por Eric 07.03.2018 / 15:00

2 respostas

1

alguns python: warning, eu sou muito novo nisso.

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())
    
por 07.03.2018 / 16:07
1

requer a data do GNU e sponge do pacote moreutils para escreva de volta para o mesmo arquivo

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