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

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

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

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.

  • как заменить выражение sed (изменить и распечатать только согласованную строку) с выражением perl?
  • Как извлечь первый код base64 из файла?
  • Как заменить строки-заполнители в документе содержимым из файла
  • Добавить строку, используя Sed на удаленной системе
  • как удалить строку из файла XML
  • Как удалить все неупорядоченные строки из текстового файла?
  • Как добавить строку, которая не начинается с '<' до предыдущей строки
  • Удалите первый и последний символы, если они есть
  • 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 в этом случае.

    Interesting Posts

    почему я должен использовать tar.xz вместо tar.gz? xz – программа сжатия данных без потерь и формат файла

    Разрешение отклонено при записи файла

    Как удалить все между двумя символами с помощью sed?

    Ошибочно ли эти ошибки пересылки BIND безопасны для игнорирования?

    Как найти устройство в RAID1 под Linux?

    Вызовите уведомление-отправить из правила udev

    Аудио не работает в Arch Linux

    Как скопировать из приложения, такого как браузер, в Emacs поверх существующего текста?

    Как я могу запланировать запуск программы python из другой программы python?

    Установите библиотеку python на версию python, отличную от стандартного

    lampp on Centos – невозможно остановить / запустить – / opt / lampp / bin / gettext: ошибка при загрузке разделяемых библиотек: libc.so.6

    Второй модуль RAM не отображается в `free` в Manjaro

    rsync от Mac ext hd до VPS работает, но не VPS для Mac

    Qemu – отладка нового syscall

    Безопасный способ позволить пользователям загружать свои открытые ключи

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