удаление на месте строк журнала со старыми отметками времени

Хорошего дня. У меня есть файл журнала, который я бы хотел удалить, но это более 30 дней.

Содержание файла:

  • Команды / скрипт Bash для удаления строки из CSV с дубликатом в столбце
  • Удаление пустой строки и строки над ней
  • GNU Найти это, но не так и сделать Sed?
  • Составляет ли sed запись в файл или дает образец вывода
  • Как манипулировать CSV-файлом с помощью sed или awk?
  • Добавление строки, содержащей escape-символ с sed
  • 2017/04/04 15:53:22 [11487] building file list 2017/04/04 15:53:22 [11487] done 2017/04/04 15:53:22 [11487] sent 163 bytes received 12 bytes 350.00 bytes/sec 2017/04/04 15:53:22 [11487] total size is 48640 speedup is 277.94 2017/04/04 15:53:29 [11493] building file list 2017/04/04 15:53:29 [11493] done 

    Попытка использования awk, но она не позволяет вам выполнять встроенные изменения в файле. Также не может использовать gawk как решение, поскольку у меня есть только v 3.7.0. Надеюсь, кто-то может помочь с sed, возможно? Ищите подходящий лайнер. Это в bash.

  • Извлечение текстовых блоков на основе вывода grep
  • Заменить с sed до совпадения в строке
  • Чтение строки переменного размера и разбиение ее содержимого на отдельные строки с текстом
  • Обратное обращение с sed
  • Сравнение двух файлов с использованием Unix и Awk
  • разрешить все IP-адреса в выводе команды с помощью стандартных инструментов командной строки
  • 4 Solutions collect form web for “удаление на месте строк журнала со старыми отметками времени”

    Если вы можете быть уверены, что на каждый день будет хотя бы одна запись, вы можете сказать:

     sed -n '\|'$(date +'%Y/%m/%d' -d '30 days ago')'|,$p' log 

    Если у вас есть GNU sed . Если нет, вам нужно избежать косой черты в дате.

     grep -v "$(date '+%Y/%m/%d' -d '30 days ago')*" logfile 

    Если у вас есть perl :

     perl -MPOSIX -ni -e ' BEGIN{$cutoff = strftime("%Y/%m/%d %T", localtime(time - 30*86400))} print if $_ ge $cutoff' file.log 

    Если у вас есть date GNU:

     file=file.log { rm -f -- "$file" && awk -v "cutoff=$(date -d '30 days ago' '+%Y/%m/%d %T')" ' $0 >= cutoff' > "$file" } < "$file" 

    И на нескольких строках для ясности, но не стесняйтесь ставить на одну строку, если это то, что вам нужно (вам понадобится ; между file.log и { и между "$file" и } при присоединении к строкам варианта awk ,

    Использование dateadd и dategrep from dateutils :

     dategrep -i "%Y/%m/%d %T" ">=$(dateadd now -30d)" </path/to/logfile 

    dateadd вычисляет dateadd время отныне до 30 дней в прошлом. Затем dategrep только печатает строки из stdin, которые содержат строку даты, более новую или равную ( >= ), чем это. Формат даты строк журнала должен быть задан -i в этом случае.

    Linux и Unix - лучшая ОС в мире.