Как получить несколько строк из сжатого файла .gz без распаковки


90

Как получить первые несколько строк из gziped-файла? Я пробовал zcat, но выдает ошибку

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

Ответы:


150

zcat(1)может быть обеспечено либо compress(1)или путем gzip(1). В вашей системе, похоже, compress(1)он ищет файл с .Zрасширением.

Переключитесь на gzip -cdвместо, zcatи ваша команда должна работать нормально:

 gzip -cd CONN.20111109.0057.gz | head

Объяснение

   -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
Кстати, если вы сидите с * .tar.gz, это вам поможет: tar -xzOf some_huge_file.tar.gz | head
demaniak

Старый поток, но это приводит к поломке канала со статусом выхода 1 с большими файлами gz. Любой чистый обходной путь?
Калин

2
Лучший и самый простой обходной путь, который я нашел до сих пор: используйте zless file.gz | head. zmoreвсе еще оставляет вас с сломанной трубой. zlessкажется, это путь.
Калин

zless не выходит ... по крайней мере, не в моем большом файле. Я все еще ищу способ сделать это без ошибок сломанной трубы ...
Freek



2

Если требуется непрерывный диапазон линий , одним из вариантов может быть:

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

где строки между 5-й и 10-й строками (обе включительно) file.gzизвлекаются в новый subFile. Дополнительные сведения sedсм. В руководстве .

Если требуется каждая, скажем, 5-я строка :

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

который извлекает 1-ю строку, перескакивает через 4 строки и выбирает 5-ю строку и так далее.


0

Этот фрагмент awk позволит вам показать не только первые несколько строк, но и диапазон, который вы можете указать. Он также добавит номера строк, которые мне понадобились для отладки сообщения об ошибке, указывающего на определенную строку в сжатом файле.

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

Вот фрагмент кода awk, использованный в одном лайнере выше. В awk NR - это встроенная переменная (количество найденных записей), которая обычно эквивалентна номеру строки. переменные from и to выбираются из командной строки с помощью параметров -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.