Я недавно придумал ситуацию, когда мне нужно обрезать некоторые довольно большие файлы журналов, когда они вырастут за определенный размер. Все, кроме последних 1000 строк в каждом файле, удаляются, работа выполняется каждые полчаса cron. Мое решение состояло в том, чтобы просто запустить список файлов, проверить размер и обрезать, если необходимо.Как я могу обрезать файлы журналов с помощью Perl?
for $file (@fileList) {
if (((-s $file)/(1024 * 1024)) > $CSize) {
open FH, "$file" or die "Cannot open ${file}: $!\n";
$lineNo = 0;
my @tLines;
while(<FH>) {
push @tLines, $_;
shift @tLines if ++$lineNo < CLLimit;
}
close FH;
open FH, ">$file" or die "Cannot write to ${file}: $!\n";
print FH @tLines;
close FH;
}
Это работает в текущей форме, но есть много накладных расходов для больших лог-файлов (особенно те, с 100_000 + линиями) из-за необходимости читать в каждой строке и переложить в случае необходимости.
Можно ли каким-либо образом прочесть только часть файла, например. в этом случае я хочу иметь доступ только к последним строкам «CLLimit». Поскольку сценарий развертывается в системе, которая увидела лучшие дни (думаю, Celeron 700 МГц с 64 МБ ОЗУ), я ищу более быструю альтернативу с использованием Perl.
Спасибо за пример bash, у меня есть что-то похожее на это для задачи, но я в процессе преобразования всех моих скриптов bash в Perl и поэтому нуждался в некоторых рекомендациях. Учебник Perl Monks выглядит многообещающим, я посмотрю на него позже. – aks
Даже с системой unix вы можете получить хвост для других ОС. :) –