¿Cómo puedo descartar las últimas n líneas de un archivo con un filtro de línea de comando de Unix?
Eso sería lo contrario de tail
: tail
descarta las primeras n líneas pero canaliza el resto, pero quiero que el comando canalice todo excepto las últimas n líneas.
Lamentablemente no he encontrado nada de eso, head
tampoco ayuda. EDITAR : al menos en Solaris no toma argumentos negativos.
Actualización: estoy interesado principalmente en una solución que funcione para archivos grandes, es decir, archivos de registro, donde es posible que desee inspeccionar lo que sucedió en los últimos minutos.
Respuestas:
Si tienes GNU
head
, puedes usarpara imprimir todas menos las últimas 5 líneas de
file.txt
.Si
head -n
no toma argumentos negativos, intentefuente
file.txt
por lo menos con seis líneas de largo ...)head
, se devuelve una salida vacía, sin errores.fuente
Aquí hay una manera simple de eliminar la última línea, que funciona en BSD, etc.
La expresión dice "en la última línea, elimínelo". Las otras líneas se imprimirán, ya que ese es
sed
el comportamiento predeterminado.Podrías encadenarlos para eliminar varias líneas
Lo cual es un poco pesado, es cierto, pero solo escanea el archivo.
También puede consultar esto para obtener más respuestas: https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file
Aquí hay una línea adaptada de uno de mis favoritos allí:
Me divertí descifrando ese, y espero que tú también lo hagas (: hace
N
líneas de búfer mientras escanea, pero por lo demás es bastante eficiente.fuente
Tengo curiosidad por qué crees
head
que no es una opción:Esto parece ajustarse a su propósito, usando, por ejemplo:
fuente
head
. BSDhead
no tiene esta opción, por lo que esta respuesta no funcionará en Solaris u otros Unixes sin GNU coreutils. El OP etiquetó específicamente esto con Unix y Unix-Utils también.Otra forma de hacerlo si
tail -n
no toma argumentos negativos esEsto eliminaría las últimas 5 líneas.
fuente