El sed
el enfoque está bien, pero recorrer todas las líneas no lo está. Si sabe cuántas líneas quiere mantener (para tener un ejemplo, uso 99 aquí), puede hacerlo así:
sed -i '100,$ d' myfile.txt
Explicación:sed
es un procesador de expresiones regulares. Con la opción -i
dado, procesa un archivo directamente ("en línea"), en lugar de simplemente leerlo y escribir los resultados en la salida estándar. 100,$
simplemente significa "desde la línea 100 hasta el final del archivo" y va seguido del comando d
, que probablemente adivinó correctamente que significa "eliminar". En resumen, el comando significa:"Eliminar todas las líneas desde la línea 100 hasta el final del archivo de myfile.txt". 100 es la primera línea que se eliminará, ya que desea mantener 99 líneas.
Editar: Si, por otro lado, hay archivos de registro que desea conservar, p. el último 100 líneas:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk '{print $1}') - 100)) d" myfile.txt
¿Qué está pasando aquí?:
[ $(wc -l myfile.txt) -gt 100 ]
:haga lo siguiente solo si el archivo tiene más de 100 líneas$((100 - $(wc -l myfile.txt|awk '{print $1}')))
:calcula el número de líneas para eliminar (es decir, todas las líneas del archivo excepto las (últimas) 100 para conservar)1, $((..)) d
:elimina todas las líneas desde la primera hasta la línea calculada
EDITAR: Como la pregunta se acaba de editar para dar más detalles, también incluiré esta información adicional con mi respuesta. Los hechos agregados son:
- un tamaño específico permanecerá con el archivo (10.000 bytes)
- cada línea tiene un tamaño específico en bytes (300 bytes en el ejemplo)
A partir de estos datos es posible calcular el número de líneas a quedar como "/", que con el ejemplo supondría 33 líneas. El término de shell para el cálculo:$((size_to_remain / linesize))
(al menos en Linux usando Bash, el resultado es un número entero). El comando ajustado ahora sería:
# keep the start of the file (OPs question)
sed -i '34,$ d' myfile.txt
# keep the end of the file (my second example)
[ $(wc -l myfile.txt) -gt 33 ] && sed -i "1,33 d" myfile.txt
Como los tamaños se conocen de antemano, ya no es necesario un cálculo incrustado en el sed
dominio. Pero por flexibilidad, dentro de algún script de shell se pueden usar variables.
Para el procesamiento condicional basado en el tamaño del archivo, se puede usar la siguiente construcción de "prueba":
[ "$(ls -lk $file | awk ' {print $5}')" -gt 100 ] &&
lo que significa:"si el tamaño de $file
excede 100kB, haz..." (ls -lk
enumera el tamaño del archivo en kB en la posición 5, por lo tanto, awk
se usa para extraer exactamente esto).