2010-09-23 17 views
11

¿Es posible mantener solo las últimas 10 líneas de una línea con un simple comando de shell?¿Cómo puedo eliminar todas menos las últimas 10 líneas de un archivo?

tail -n 10 test.log 

ofrece el resultado correcto, pero no sé cómo modificar test.log. Y

tail -n 10 test.log > test.log 

no funciona.

+3

como regla general, nunca use un archivo simultáneamente como entrada y salida, nunca se sabe cómo terminará. – tokland

+0

Buen consejo. Acabo de hacer 'tail -n 10 test.log> test.log' y terminé sin nada (un archivo en blanco). – sam

Respuesta

16

Puede hacerlo usando el archivo de temp. comando

tail -n 10 test.log > test1.log 

mv test1.log test.log 
+0

Esto funciona, gracias. Sin embargo, ** NO olvide el '1' ** porque hice' tail -n 10 test.log> test.log' ¡y me queda un archivo en blanco! – sam

1

invocación ed (editor de texto):

echo -e '1,-10d\nwq' | ed <filename> 

Esto enviará comandos para borrar líneas ('1, -10 D'), guardar el archivo ('w') y salida ('q ').

También tenga en cuenta que ed falla (el código de retorno es 1) cuando el archivo de entrada tiene menos de 11 líneas.

Editar: También puede utilizar el editor vi (o ex comandos):

vi - +'1,-10d|wq' <filename> 

Pero si el archivo de entrada tiene permanecerá abierto 10 o menos líneas editor vi y debe escribir ': q' para salir (o 'q' con el comando ex).

1
ruby -e 'a=File.readlines("file");puts a[-10..-1].join' > newfile 
1

También se puede utilizar una variable:

LOG=$(tail -n 10 test.log) 
echo "$LOG" > test.log 
8
echo "$(tail -n 10 test.log)" > test.log 

comillas son importantes. Conservan caracteres de nueva línea.

Cuestiones relacionadas