Назад | Перейти на главную страницу

Разделить большой файл журнала с помощью суффикса, например, от logrotate

после того, как я увидел, что забыл добавить logrotate-conf для php5-fpm.log на одном сервере, и теперь, видя, что он ДЕЙСТВИТЕЛЬНО вырос, я спрашиваю себя, как разделить этот файл журнала на отдельные, с помощью Суффикс вроде logrotate будет производить. Вы знаете ... как будто этой ошибки никогда не было :-P

Но самое близкое, что я придумал, это:

split -C 10m -d php5-fpm.log php5-fpm.log.

... но при этом создаются такие файлы, как:

php5-fpm.log.00
php5-fpm.log.01
php5-fpm.log.02
...

отсечение начальных нулей от суффикса было бы простой задачей, и ее легко можно было бы сделать вручную. Но вот моя проблема: как я могу изменить суффикс, чтобы файл с самым высоким суффиксом стал файлом с самым низким ??

Чтобы сократить длину суффикса (исключить нули), вы можете сделать следующее:

$ split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.log.

К сожалению, нет параметра, который вы могли бы передать в split, который бы инвертировал суффиксы, но вы можете использовать tac вместо cat, инвертировать файл и передать его команде split, например:

$ tac php5-fpm.log | split --suffix-length=1 -C 10m -d - php5-fpm.log.

Теперь все, что вам нужно сделать, это еще раз инвертировать разделенные файлы (и сжать их, пока мы находимся на этом этапе) :)

$ for i in php5-fpm.log.*; do tac $i | gzip > $i.gz; rm -f $i; done

РЕДАКТИРОВАТЬ:

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

split --suffix-length=1 -C 10m -d php5-fpm.log php5-fpm.
export COUNT=$(expr $(ls php5-fpm.[0-9] | wc -l) - 1)
for i in $(seq 0 $COUNT); do
    mv php5-fpm.$i php5-fpm.log.$(expr $COUNT - $i);
done

Первая команда разделит большой файл журнала на более мелкие: php5-fpm.0 php5-fpm.1 php5-fpm.2 ... позже вы подсчитываете количество файлов и только инвертируете числа с помощью оценки выражения bash: expr (1).

Вы можете добиться переименования с помощью этого быстрого и грязного сценария оболочки:

#!/bin/bash
for x in php5-fpm.log.*
do
  max=${x/php5-fpm.log./}
done
mkdir renamed-files || exit 1
for x in php5-fpm.log.*
do
  num=${x/php5-fpm.log./}
  let num=max-num+1
  mv $x renamed-files/php5-fpm.log.$num
done
mv renamed-files/* .
rmdir renamed-files

Обратите внимание, что переименованные файлы собираются в подкаталоге, чтобы избежать конфликтов имен с еще не переименованными файлами.

Обратите внимание также на выход после mkdir в случае подкаталога renamed-files не может быть создан, например, потому что файл с таким именем существует. В этом случае продолжение сценария может иметь необратимые нежелательные последствия.