Cách lấy vài dòng từ tệp nén .gz mà không cần giải nén


89

Làm cách nào để lấy một vài dòng đầu tiên từ tệp gziped? Tôi đã thử zcat, nhưng nó báo lỗi

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

Câu trả lời:


149

zcat(1)có thể được cung cấp bởi một trong hai compress(1)hoặc bởi gzip(1). Có vẻ như trên hệ thống của bạn compress(1)- nó đang tìm kiếm một tệp có .Zphần mở rộng.

Chuyển sang gzip -cdthay thế zcatvà lệnh của bạn sẽ hoạt động tốt:

 gzip -cd CONN.20111109.0057.gz | head

Giải trình

   -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
BTW, nếu bạn đang ngồi với một .tar.gz *, điều này sẽ giúp bạn: tar -xzOf some_huge_file.tar.gz | head
demaniak

Chủ đề cũ nhưng điều này tạo ra một đường ống bị hỏng với trạng thái thoát 1 với các tệp gz lớn. Bất kỳ giải pháp sạch nào?
kaligne

2
Cách giải quyết tốt nhất và dễ nhất mà tôi đã tìm thấy cho đến nay: sử dụng zless file.gz | head. zmorevẫn để lại cho bạn đường ống bị hỏng. zlessdường như là một con đường để đi.
kaligne

zless không thoát ... ít nhất là không có trên tệp lớn của tôi. Tôi vẫn đang tìm cách thực hiện việc này mà không bị lỗi đường ống ...
Freek


11

Trên máy Mac, bạn cần sử dụng <với zcat:

zcat < CONN.20111109.0057.gz|head


2

Nếu cần một loạt các dòng liên tục , một tùy chọn có thể là:

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

trong đó các dòng giữa dòng thứ 5 và thứ 10 (cả hai dòng) file.gzđều được trích xuất thành dòng mới subFile. Để biết sedcác tùy chọn, hãy tham khảo sách hướng dẫn .

Nếu mọi, giả sử, dòng thứ 5 là bắt buộc:

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

trích dòng đầu tiên và nhảy qua 4 dòng và chọn dòng thứ 5, v.v.


không hoạt động trên MacOSX
Wolfgang Fahl

0

Đoạn mã awk này sẽ cho phép bạn hiển thị không chỉ một vài dòng đầu tiên - mà cả một phạm vi bạn có thể chỉ định. Nó cũng sẽ thêm số dòng mà tôi cần để gỡ lỗi thông báo lỗi trỏ đến một dòng nhất định trong một tệp gzipped.

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

Đây là đoạn mã awk được sử dụng trong một lớp lót ở trên. Trong awk NR là một biến tích hợp sẵn (Số lượng bản ghi được tìm thấy cho đến nay) thường tương đương với một số dòng. biến from và to được chọn từ dòng lệnh thông qua các tùy chọn -v.

NR>=from {
   print NR,$0; 
   if (NR>=to) 
     exit 1
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.