Удалить строки в файлах определенной папки рекурсивно ранее определенной даты SED, AWK
подскажите как с помощью sed, awk удалить все что старше 7 денй рекурсивно во всех файлах , во всех папках /home/*/ *.log в файлах. Формат файла такой:
2018-12-23 23:34:43.358 7 INFO
2019-06-12 12:33:43.358 7 INFO
2020-05-12 11:23:43.358 7 INFO
2020-09-23 10:34:43.358 7 INFO
Ответы (1 шт):
Важно!
Данный ответ как таковым решением не является и мне кажется вряд ли будет решение которое подойдет путем sed или awk.
Во время выполнения сценария, из логов будут удалены все строки не начинающиеся с даты формата %Y-%m-%d, т.е. если будет строка за сегодня, потом строка без указания даты и опять строка за сегодня, то строка без даты все равно будет удалена.
Так же большой диапазон дат может вызвать ошибку при выполнении.
#Переменная для указания промежутка времени, текущий день +1, т.е. если указано 6, то получаем с сегодняшним днем 7 дней
todate=6
#Так как переменная дописываемая, лучше ее очищать
unset datestr
#Цикл для формирования строки с датами, для дальнейшего использования в команде sed
for ((i=-$todate; i<=0; i++)); do
if [ $i -eq 0 ]; then
datestr+=`date -d "$i day" +'^%Y-%m-%d'`
else
datestr+=`date -d "$i day" +'^%Y-%m-%d\|'`
fi
done
#Обрабатываем все файлы подходящие под маску, удаляя из них все кроме строк где в начале будут строки из диапазона дат созданных в цикле
sed /"$datestr"/\!d /home/*/*.log
В sed убран параметр -i, который перезаписует файл, перед его добавлением лучше убедится, что вывод команды корректен и не возникает ошибко, параметр устанавливается сразу после вызова sed -i ...
Потребность в удалении логов, а так же оптимизации хранения и не только, можно удовлетворить с помощью того же logrotate, более подробно можно прочитать в интернете или выполнить команду man logrotate в терминале.