eu tenho um processo rodando sempre com arquivo de log que pode chegar a até 5 giga, às vezes eu tenho que pegar uma fatia desse log com base no intervalo de tempo (geralmente eu usei dd). existe algum comando no Linux para obter a fatia do log com base no intervalo de tempo?
PS: não há registro de data e hora na maioria das linhas deste log.
Responder1
Se não existe um comando que permita fazer isso (como sugerido por Wiese), por que você não cria um índice externo do seu arquivo?
Apenas a ideia: você pode fazer um script que rode para sempre (ou quase veja as notas abaixo), e dar os intervalos de tempo para criar o índice.
PIDofThisInstance=$$
# ... you code for the header, checks...
while true ; do
# This is the core of your cycle
sync # Maybe
CurrentSize=`ls -s $MyFile | awk '{print $1} ' `
CurrentTime=`date +"%Y%m%d%H%M%S"`
echo $CurrentTime $CurrentSize >> $Log_Of_My_Log_File
sleep $TimeToSleep
# if (exit-condition)
# then
# break #Exit from the infinite loop.
# fi
done
Depois você pode fazer outro script que, dada a data/hora de início/término, responda com os tamanhos de início/término. A partir desses números você pode cortar seu arquivo.
Você disse que é um arquivo enorme. Então eu não sugiro que você faça isso comnúmeros de linhae talvez head MyFile.log -n xxx | tail -n yyy
. Vai demorar muito. Melhor trabalhar com tamanho.
Notas:
- Se este for um log com saída formatada (mesmo que você não saiba) é sempre possível que exista alguma ferramenta de análise da empresa desenvolvedora/programador. É possível que seja lançado mesmo depois de anos. É melhor IMHO não mexer nesse formato e criar um arquivo separado.
- Escreva no seu script parâmetros como PID atual (caso precise matar manualmente), o nome do arquivo (objeto do logging), se você conhece o PID do programa que gera o log...
- O ciclo pode ser eterno ou terminar se você tiver uma condição como: o PID do programa que gera o log não existe mais, o arquivo não existe mais, o tamanho real é menor que o antigo (você move o arquivo ou reinicie o log que você precisa para reiniciar a indexação).
- Se você mantiver na memória o $LastSize você pode decidir evitar imprimir linhas no "log do log" quando não for necessário, ou parar depois de um longo tempo sem atividade (ou modificar dinamicamente o intervalo de tempo...)