Se a sua versão de sed
tiver a opção --in-place
, você poderá usá-la. Ele ainda faz um cp
e mv
, mas está nos bastidores para que o script pareça um pouco menos confuso, dependendo de como você se sente sobre a sintaxe sed
. Caso contrário, seu método tail
(você perdeu um em sua edição) e o método de anexação é o modo como eu o abordaria.
Outra abordagem usando sed
seria manter seu log de cabeça para baixo com a entrada mais recente no começo.
sed -ni '1s/^/New Entry\n/;100q;p' logfile
Isso é tudo o que existe para isso (além de fazer com que "Nova Entrada" seja o que você quer). Isso manterá um arquivo de log de 100 linhas em ordem cronológica inversa. A vantagem é que você não precisa saber quantas linhas estão no arquivo ( tail
cuida disso, mas sed
não). Isso pressupõe, até certo ponto, que suas entradas de log consistam em uma única linha. Se você está registrando uma quantidade significativa de saída de um script, acho que está de volta para tail
e anexar.
Ainda outra opção que pode funcionar bem para uma saída detalhada de várias linhas seria deixar o sistema de arquivos fazer o trabalho para você. Cada entrada de log seria um arquivo separado.
#!/bin/bash
# *** UNTESTED ***
logdir="/path/to/your/log/dir"
# run the script and log its output to a file named with the date and time
script > "$logdir/$(date "+%Y%m%dT%H%M%S").log"
# maintain the logs
# keep the last 100 days of daily logfiles
# (you could keep the last 100 hours of hourly logfiles, for example,
# by using -mmin and doing some math)
# the count is intended to keep old entries from being deleted
# leaving you with nothing if there are no new entries
count=$(find "$logdir" -maxdepth 1 -type f | wc -l)
if (( count > 100 ))
then
find "$logdir" -maxdepth 1 -type f -mtime +100 -delete
fi