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

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

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 в этом случае.

  • Удаление всех комментариев C с помощью sed
  • sed -e 's / ^ //' не работает для первой строки
  • Как извлечь строки между двумя шаблонами в одном столбце?
  • Конкатенация последовательностей под заголовком
  • Замените новые строки char (^ M) во всех файлах, а затем переименуйте файл на основе строки char
  • dpkg: error: дублировать запрос запуска файла для имени файла `/ usr / lib / gio / modules 'и пакета` libglib2.0-0'
  • Получить конкретное слово и следующий текст
  • Как использовать хэш (#) в качестве разделителя для sed
  • Удалить все строки, содержащие повторяющиеся буквы
  • Подсчитайте ненулевые числа для каждой строки второго столбца в текстовом файле
  • Как создать имя файла для конвейера для удаления всех файлов?
  • Почему нет? регулярный символ создает совпадение в sed?
  • Linux и Unix - лучшая ОС в мире.