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

Похоже, что значение "execute only" не имеет особого смысла для файла, но его можно использовать для предотвращения чтения содержимого каталога.

$ mkdir foo
$ touch foo/bar
$ ls foo/
bar
$ chmod 100 foo
$ ls foo/
ls: cannot open directory foo/: Permission denied
1
09.05.2017, 11:49
4 ответа
grep -v "$(date '+%Y/%m/%d' -d '30 days ago')*" logfile 
0
27.01.2020, 23:45

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

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

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

0
27.01.2020, 23:45

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

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

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

1
27.01.2020, 23:45

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

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

Если у вас GNUdate:

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.

0
27.01.2020, 23:45

Теги

Похожие вопросы