Como obter algumas linhas de um arquivo compactado .gz sem descompactar

90

Como obter as primeiras linhas de um arquivo compactado com gzip? Tentei zcat, mas está gerando um erro

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

Respostas:

151

zcat(1)pode ser fornecido por compress(1)ou por gzip(1). Em seu sistema, parece ser compress(1)- está procurando um arquivo com um.Z extensão.

Mude para gzip -cdno lugar de zcate seu comando deve funcionar bem:

 gzip -cd CONN.20111109.0057.gz | head

Explicação

   -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.
Sarnold
fonte
7
Aliás, se você estiver sentado com um * .tar.gz, isso o ajudará: tar -xzOf some_huge_file.tar.gz | head
demaniak
Tópico antigo, mas isso produz um canal quebrado com status de saída 1 com grandes arquivos gz. Qualquer solução alternativa limpa?
Kaligne de
2
A melhor e mais fácil solução que encontrei até agora: use zless file.gz | head. zmoreainda deixa você com o tubo quebrado. zlessparece ser o caminho a percorrer.
Kaligne
zless não sai ... pelo menos não no meu arquivo grande. Ainda estou procurando uma maneira de fazer isso sem erros de cano quebrado ...
Freek
14

Em alguns sistemas (por exemplo, Mac), você precisa usar gzcat.

Marcelo Cantos
fonte
11

Em um mac, você precisa usar o <com zcat:

zcat < CONN.20111109.0057.gz|head

punkrockpolly
fonte
2

Se for necessário um intervalo contínuo de linhas , uma opção pode ser:

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

onde as linhas entre a 5ª e a 10ª linhas (ambas inclusivas) de file.gzsão extraídas em um novo subFile. Para sedopções, consulte o manual .

Se toda, digamos, a 5ª linha for necessária:

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

que extrai a 1ª linha e salta mais de 4 linhas e escolhe a 5ª linha e assim por diante.

Herpes Free Engineer
fonte
0

Este snippet do awk permitirá que você mostre não apenas as primeiras linhas - mas um intervalo que você pode especificar. Ele também adicionará números de linha que eu precisava para depurar uma mensagem de erro apontando para uma determinada linha em um arquivo compactado.

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

Aqui está o snippet do awk usado no liner acima. No awk, NR é uma variável embutida (Número de registros encontrados até agora) que geralmente é equivalente a um número de linha. as variáveis ​​from e to são obtidas na linha de comando por meio das opções -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Wolfgang Fahl
fonte