У меня есть файл, который содержит различные даты и IP-адреса, которые мне нужны для ежедневной очистки. Формат файла:

# 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

Ежедневно я хочу удалить любую строку комментария + IP-адрес под ней, который старше 30 дней. Для этого я легко могу сделать переменную bash "LAST_MONTH = date --date="-30 days" +%Y-%m-%d " и достаточно легко получить строки, выполнив "DELETE = $(cat /var /www /html /ips | grep $ DATE -A1)".

Отсюда я мог бы технически использовать sed для удаления таких строк, как "sed -i" s/$ DELETE/test/g "" $ FILE "", но есть хеш-теги и несколько строк, так что это на самом деле не работает для меня прямо сейчас.

Что бы вы посоветовали как лучший способ сделать это? Я не хочу создавать другой временный файл, если это вообще возможно. Я также был бы заинтересован в решениях bash и Python.

Благодарю.

2 ответа2

1

требуется дата GNU и sponge из пакета moreutils для обратной записи в тот же файл

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

немного python: предупреждение, я довольно новичок в этом.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .