Cómo obtener algunas líneas de un archivo comprimido .gz sin descomprimir


89

¿Cómo obtener las primeras líneas de un archivo gziped? Intenté zcat, pero arroja un error

zcat CONN.20111109.0057.gz|head
CONN.20111109.0057.gz.Z: A file or directory in the path name does not exist.

Respuestas:


149

zcat(1)puede ser suministrado por cualquiera compress(1)o por gzip(1). En su sistema, parece estar compress(1): está buscando un archivo con una .Zextensión.

Cambie a gzip -cden lugar de zcaty su comando debería funcionar bien:

 gzip -cd CONN.20111109.0057.gz | head

Explicación

   -c --stdout --to-stdout
          Write output on standard output; keep original files unchanged.  If there are several input files, the output consists of a sequence of independently compressed members. To obtain better compression, concatenate all input files before compressing
          them.

   -d --decompress --uncompress
          Decompress.

7
Por cierto, si estás sentado con un * .tar.gz, esto te ayudará: tar -xzOf some_huge_file.tar.gz | head
demaniak

Hilo antiguo, pero esto produce una tubería rota con estado de salida 1 con archivos gz grandes. ¿Alguna solución limpia?
Kaligne

2
La mejor y más fácil solución alternativa que he encontrado hasta ahora: use zless file.gz | head. zmoretodavía te deja con la tubería rota. zlessparece ser el camino a seguir.
Kaligne

zless no sale ... al menos no en mi archivo grande. Todavía estoy buscando una manera de hacer esto sin errores de tubería rota ...
Freek



2

Si se necesita un rango continuo de líneas , una opción podría ser:

gunzip -c file.gz | sed -n '5,10p;11q' > subFile

donde las líneas entre las líneas 5 y 10 (ambas inclusive) de file.gzse extraen en un nuevo subFile. Para conocer las sedopciones, consulte el manual .

Si se requiere cada, digamos, la quinta línea :

gunzip -c file.gz | sed -n '1~5p;6q' > subFile

que extrae la 1ª línea y salta 4 líneas y elige la 5ª línea y así sucesivamente.


0

Este fragmento de awk le permitirá mostrar no solo las primeras líneas, sino un rango que puede especificar. También agregará los números de línea que necesitaba para depurar un mensaje de error que apunta a una cierta línea hacia abajo en un archivo comprimido con gzip.

gunzip -c file.gz | awk -v from=10 -v to=20 'NR>=from { print NR,$0; if (NR>=to) exit 1}'

Aquí está el fragmento de awk que se usa en la línea anterior. En awk NR es una variable incorporada (Número de registros encontrados hasta ahora) que generalmente es equivalente a un número de línea. las variables desde y hasta se recogen de la línea de comandos mediante las opciones -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.