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

Хорошего дня. У меня есть файл журнала, который я бы хотел удалить, но это более 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.

  • Удаление последнего символа одним словом, но только если символ присутствует - в bash
  • Как заменить только N-е вхождение шаблона в файл?
  • Игнорировать разделитель, присутствующий внутри кавычек
  • sed, чтобы заменить пустую строку двумя строками содержимого
  • sed - не добавляет новую строку EOF и заменяет букву не определенной
  • Редактировать файлы с помощью sed и сохранять результат в разных файлах, имена которых основаны на исходных именах файлов
  • заменить шаблон между двумя символами
  • Возвращая только часть строки после соответствующего шаблона (Unix)
  • 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

    Обрезать последние несколько видеокадров, используя только инструменты командной строки

    Каковы последствия рекурсивного использования каталогов на внешнем диске, который в настоящее время имеет разрешения 501: dialout или root: root?

    Как сделать загрузочный USB из командной строки?

    rpc.statd и avahi-daemon прослушивают все сети?

    Вероятно, диск скоро завершится

    как найти в каталоге с изменяющимся шаблоном?

    Измените пользователя и загрузите всю среду в сценарий оболочки

    Карта чтения / записи файла для получения вывода / отправки ввода в скрипт?

    Как найти недостающий код C

    Где я должен установить внешний жесткий диск?

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

    Проверьте, какой процесс выдает среднюю нагрузку сверху

    Могу ли я запустить gedit при запуске со списком определенных файлов?

    mv `Список аргументов слишком длинный` для одного файла

    Команда высокого уровня для запроса нескольких ветвей snmp в одном сеансе tcp-сессии?

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