Tenemos la mejor respuesta que descubrimos on line. Nosotros queremos que te sea de mucha utilidad y si puedes comentarnos algo que nos pueda ayudar a mejorar hazlo libremente.
Solución:
los 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 conservar 99 líneas.
Editar: Si, por el contrario, hay archivos de registro en los que desea mantener, por ejemplo, el ultimo 100 líneas:
[ $(wc -l myfile.txt) -gt 100 ] && sed -i "1,$(($(wc -l myfile.txt|awk 'print $1') - 100)) d" myfile.txt
Que esta pasando aqui:
[ $(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')))
: calcular el número de líneas a eliminar (es decir, todas las líneas del archivo excepto las (últimas) 100 a 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:
- especifico Talla 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 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
supera los 100kB, haz…” (ls -lk
enumera el tamaño del archivo en kB en la posición 5, por lo tanto awk
se utiliza para extraer exactamente esto).