Foros del Web » Administración de Sistemas » Unix / Linux »

Leer una porcion de un archivo desde terminal Linux

Estas en el tema de Leer una porcion de un archivo desde terminal Linux en el foro de Unix / Linux en Foros del Web. Buenas gente, Tengo que leer desde la terminal un archivo que es bastante grande, pero yo no quiero cargar a memoria todo el archivo ya ...
  #1 (permalink)  
Antiguo 15/05/2015, 13:01
 
Fecha de Ingreso: abril-2015
Mensajes: 13
Antigüedad: 9 años
Puntos: 0
Leer una porcion de un archivo desde terminal Linux

Buenas gente,

Tengo que leer desde la terminal un archivo que es bastante grande, pero yo no quiero cargar a memoria todo el archivo ya que solo me sirve una partecita.

Supongamos que el archivo es de 60Mb, bueno yo quiero leer 20 Mb , partiendo desde los 1eros 20 Mb, es decir leeria desde 20 a 40.

La idea es hacer esto desde la terminal y que la salida a pantalla sean estos 20Mb de datos.

A todo esto es muy importante leer desde una cierta posicion la cantidad de bytes que yo desee

Alguno que me de una mano con esto??
  #2 (permalink)  
Antiguo 15/05/2015, 16:05
 
Fecha de Ingreso: mayo-2014
Ubicación: US
Mensajes: 17
Antigüedad: 10 años
Puntos: 1
Respuesta: Leer una porcion de un archivo desde terminal Linux

Hay varias formas de hacerlo

Por ejemplo para ver desde 20M hasta 40M en un fichero de 60M correrias en la consola


# tail --bytes=40M tu-fichero | head --bytes=20M | less

Lo que hace el comando es selecionar los ultimos 40M del dichero original dejando fuera las primeros 20M , luego extrae los primeros 20M del comando anterior y lo mando al comando less para que no vuelen delante de ti


Saludos
Manuel.
  #3 (permalink)  
Antiguo 15/05/2015, 20:40
 
Fecha de Ingreso: abril-2015
Mensajes: 13
Antigüedad: 9 años
Puntos: 0
Pregunta Respuesta: Leer una porcion de un archivo desde terminal Linux

Cita:
Iniciado por servervirto Ver Mensaje
Hay varias formas de hacerlo

Por ejemplo para ver desde 20M hasta 40M en un fichero de 60M correrias en la consola


# tail --bytes=40M tu-fichero | head --bytes=20M | less

Lo que hace el comando es selecionar los ultimos 40M del dichero original dejando fuera las primeros 20M , luego extrae los primeros 20M del comando anterior y lo mando al comando less para que no vuelen delante de ti


Saludos
Manuel.
Hola Manuel!!!

Primero que todo gracias por la mano,

Mmm si lo resolveria parcialmente, pero el tail me leeria los primeros 40 Mb para que luego el head me los corte en 20, en si resuelve el problema, pero leo datos que no me sirven me explico.

Leo desde 0 hasta 20Mb, y esos datos ami no me servian, perdi tiempo leyendo datos que no me servian.

Voy al grano, yo necesito este cacho de bytes para despues desde un programita en C tomar estos datos en un pipe y redireccionarlos para que sea la entrada de otro. El tema es que mi aplicacion entera tiene un alto grado de concurrencia, por ende no puedo perder performance leyendo datos que no me sirvan, por esta cuestion es que necesito leer desde una X posicion una Y cantidad de bytes sin leer bytes que no valla a usar.
  #4 (permalink)  
Antiguo 18/05/2015, 10:25
 
Fecha de Ingreso: mayo-2015
Ubicación: Argentina
Mensajes: 2
Antigüedad: 9 años
Puntos: 1
Respuesta: Leer una porcion de un archivo desde terminal Linux

Hola aleixen,

Para poder darte una mayor ayuda sería interesante saber que patron estas buscando en este file, de esta manera tendríamos un número de arranque.
ej (palabra Nabucodonosor)

Unix_Tricks> FirstLine=$(cat -n TuFichero | grep -i "Nabucodonosor" | awk ' {print $1 }'); Unix_Tricks> lastLine=$(cat -n TuFichero | tail -1 | awk '{ print $1 }');
Unix_Tricks> echo $FirstLine
2037 --> (este número de linea es donde encontró lo que te interesa "aca tenes la posición")
Unix_Tricks> echo $lastLine
2070 --> (este otro número es el final del Fichero)
Unix_Tricks>

Con estas dos variables podes limitar tu Fichero y ahi podes aplicar lo que sugirió Manuel.

Espero poder haberte ayudado.
Saludos cordiales,
unixtrick
  #5 (permalink)  
Antiguo 18/05/2015, 10:58
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Leer una porcion de un archivo desde terminal Linux

aleixen,
Si ya estás usando C, ¿por qué no usas fseek() en C (o para el caso, Perl, TCL, Python, u otro lenguaje disponible)? Pedirle rendimiento y eficiencia a un shell script es perder el tiempo, hay ciertas tareas que simplemente no se adaptan bien a lo que hacen bien los programas de la línea de comandos (leer texto)

unixtricks,
La solución que proponés usa 6 procesos, y lee el archivo dos veces, solamente para obtener números de línea (con lo cual habría que leer el archivo de nuevo para obtener los datos). Ciertamente no mejora la eficiencia del proceso :)
  #6 (permalink)  
Antiguo 18/05/2015, 12:38
 
Fecha de Ingreso: mayo-2014
Ubicación: US
Mensajes: 17
Antigüedad: 10 años
Puntos: 1
Respuesta: Leer una porcion de un archivo desde terminal Linux

Como AlvaroG dijo si estas programando en C, la solucion seria utilizar fseek

20*1024*1024= convertir bytes to Mbytes

int main ()
{
FILE *fp;

fp = fopen("file.txt","r");
fseek( fp, 20*1024*1024, SEEK_SET );

// Pon loop para leer 20M aqui

fclose(fp);

return(0);
}

Etiquetas: archivo.txt, terminal
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:44.