Descartar o conteúdo do arquivo de log, mantendo a cauda

3

Estou procurando uma maneira de descartar o conteúdo do arquivo de log, deixando apenas a cauda definida. Em dois passos é muito fácil:

tail -n1000 alert_migtst.log > alert_migtst.tail
mv -f alert_migtst.tail alert_migtst.log

Existe uma maneira de conseguir o mesmo com um único comando, entre outras razões para evitar possíveis perdas de linhas?

    
por Ren 26.06.2014 / 12:08

3 respostas

2

Você pode usar sed

sed -e :a -e '$q;N;1001,$D;ba' -i filename
  • -e define um script (comando)
  • :a define um rótulo
  • $q define um endereço ( $ final do arquivo) e ramificações q para ele
  • N acrescenta a próxima linha de entrada ao espaço padrão
  • 1001,$d exclui toda a linha entre 1001 e o final do arquivo (por causa do N anterior eles serão anexados ao espaço padrão)
  • ba ramifica para o rótulo definido no início

Por exemplo (últimas 3 linhas do arquivo)

$ cat alert_migtst.log 
1
2
3
4
5
6
7
8
9
$ sed -e :a -e '$q;N;4,$D;ba' -i alert_migtst.log 
$ cat alert_migtst.log 
7
8
9
    
por 26.06.2014 / 13:02
0

Você pode tentar usar esponja que pode instalar com o pacote moreutils . Ele permite redirecionar a saída no mesmo arquivo (caso contrário, você o exclui).

   tail -n1000 alert_migtst.log | sponge alert_migtst.log

Como uma regra normal, pratique com todas as soluções encontradas antes de usá-las em arquivos críticos.

    
por 27.06.2014 / 08:23
0

Você pode usar o Vim no modo Ex:

ex -sc '1,-1000d|x' alert_migtst.log
  1. 1,-1000 seleciona todas menos as últimas 1000 linhas

  2. d delete

  3. x salvar e fechar

por 11.04.2016 / 02:47

Tags