У меня есть файл, содержащий различные даты и 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.
Спасибо.
решение1
немного питона: предупреждение, я новичок в этом деле.
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())
решение2
требуется дата GNU, иsponge
из пакета moreutils для обратной записи в тот же файл
awk -v ago="$(date -d '30 days ago' '+%F %T')" '
$1 == "#" && $2" "$3 < ago {getline; next}
{print}
' file | sponge file