Có một công cụ kết hợp zcat và mèo trong suốt?


70

Khi xử lý các tệp nhật ký, một số kết thúc là các tệp được nén bằng và các tệp logrotatekhác thì không. Vì vậy, khi bạn thử một cái gì đó như thế này:

$ zcat *

bạn kết thúc với một dòng lệnh như zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gzvà sau đó với:

gzip: xyz.log: not in gzip format

Có một công cụ sẽ lấy các byte ma thuật, tương tự như cách filehoạt động và sử dụng zcathoặc cattùy thuộc vào kết quả để tôi có thể dẫn đầu ra ra grepchẳng hạn?

NB: Tôi biết tôi có thể viết kịch bản, nhưng tôi đang hỏi liệu đã có công cụ nào chưa.

Câu trả lời:


41

zless

Có vẻ đáng tiếc zcat, vì libz có API hỗ trợ đọc từ cả tệp nén và tệp không nén trong suốt. Nhưng trang này nói rằng zcatnó tương đương với gunzip -c.


Cảm ơn bạn cho sự thay thế này. Tôi có thể nghĩ về điều đó, tôi có thể không? ;) ... oh tốt. Spot on, +1 và chấp nhận (cũng bởi vì bạn có ít đại diện hơn người trả lời khác).
0xC0000022L

Kinh ngạc. Đã giúp tôi rất nhiều, tôi đã sử dụng shell script để giải quyết điều đó trong nhiều năm ... hoặc một kịch bản perl khủng khiếp ... log giải quyết hợp nhất, được sử dụng bởi awstats ... bây giờ tôi biết công cụ tuyệt vời này. Cảm ơn.
Luciano Andress Martini

98

Hãy thử nó với -fhoặc --force:

zcat -f -- *

zcatchỉ là một tập lệnh đơn giản chạy

exec gzip -cd "$@"

với các tùy chọn dài sẽ dịch sang

exec gzip --stdout --decompress "$@"

và, theo man gzip(nhấn mạnh của tôi):

-f - lực lượng
      Buộc nén hoặc giải nén ngay cả khi tệp có nhiều liên kết
      hoặc tệp tương ứng đã tồn tại hoặc nếu dữ liệu nén là
      đọc từ hoặc viết đến một thiết bị đầu cuối. Nếu dữ liệu đầu vào không ở định dạng
      được nhận dạng bởi gzip và nếu tùy chọn --stdout cũng được cung cấp, hãy sao chép
      dữ liệu đầu vào mà không thay đổi thành đầu ra tiêu chuẩn: hãy để zcat hành xử như con mèo .

Cũng thế:

để tôi có thể dẫn đầu ra thành grepví dụ

Bạn có thể sử dụng zgrepcho điều đó:

zgrep -- PATTERN *

mặc dù xem bình luận của Stéphane bên dưới.


1
Cảm ơn, đó là một zlessgiải pháp thay thế thú vị . Đẹp và +1.
0xC0000022L

6
Lưu ý rằng cả hai zlesszgreplà các tập lệnh thực hiện cuộc gọi gzip -cdfq(đó là zcat -fq).
Stéphane Chazelas

9

Tôi sử dụng chính xác cho cùng một mục đích:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....

Tôi thích cách tiếp cận này bởi vì, nó đòi hỏi ít thời gian nhất để giáo dục đồng nghiệp. Nếu các thông điệp tường trình có dấu thời gian trong dấu thời gian thân thiện với sắp xếp, thì điều này đặc biệt hữu ích.
Thomas L Holaday

Cách tiếp cận tuyệt vời. Cảm ơn.
Miloš Đakonović

7

Có một sự thay thế thả vào cho ztools (zcat, zgrep, ..) được gọi là zutils kết hợp tất cả các công cụ giải nén độc lập với phụ trợ. Vì vậy, với cùng một lệnh, bạn có thể đọc các tệp đơn giản, lzma, gzipped, xz trong suốt.

Nó có sẵn trong debian wheezy hoặc mới hơn, có thể là redhat / centos.

Trang của dự án ở đây nongnu.org

Một bài đăng blog giải thích việc sử dụng tại đây ( noone.org )


3

Điều này hoạt động tốt trong RHEL 5.x trong đó zcat là nhị phân. Nó thất bại trong RHEL 6.x (và Ubuntu 12.x) trong đó zcat là một tập lệnh. Điều này được sử dụng để làm việc tốt.

Tôi hoàn toàn không sử dụng zcat nhưng zgrep sẽ không xử lý đúng các tệp không nén.


2

Mở cả nén và không nén, theo thứ tự thời gian.

ls -v syslog* | tac | xargs zcat -f | less

Nó đưa ra thứ tự sai với hơn mười tệp nhật ký (syslog.10.gz ...)
Vanni

Nắm bắt tốt. -v nên sửa nó.
Ryan

ls -rvđể tránh tac. Đối với các tệp nhật ký, less $(ls -rv syslog*)với LESSOPENvar env của bạn được thiết lập đúng hoạt động tốt. Bạn có thể thực hiện tìm kiếm trên các tệp esc-nđể tìm kết quả khớp tiếp theo, bỏ qua ranh giới tệp.
Peter Cordes

Với zsh:zcat -f syslog*(nOn)
Stéphane Chazelas

Điều này không hoạt động nếu bạn có xoay vòng nhật ký của mình để nén vào ngày hôm sau
cjbarth

1

Còn bọc thì sao?

$ cat xcat.sh 
#!/bin/bash

for i in $@;do 
        [ ! -z "$(file -i $i | grep "gzip")" ] && zcat $i || cat $i
done

$ bash xcat.sh plain.txt gzipped_text.gz

0

Sao chép và dán (hoặc đặt nó ở cuối ~/.bashrctệp của bạn ) chức năng bash này :

logs() { zcat -f $(ls -rv "$1"*) | less; }

Bây giờ bạn có thể nhập ví dụ logs /var/log/sysloghoặc logs /var/log/nginx/access.logđể xem tất cả các thông điệp nhật ký syslog hoặc nginx từ cũ nhất đến mới nhất với ít hơn .

Sau đó, bạn có thể tìm kiếm một cái gì đó/somethingvà nhấn ncho tiếp theo .


0

Có một kịch bản perl đẹp tuyệt vời làm điều này. Đó là logresolvemerge.pl từ dự án awstats: http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge cho phép bạn có được một tệp nhật ký đầu ra duy nhất, được sắp xếp theo ngày, được xây dựng từ các nguồn cụ thể:

  • Nó có thể đọc một số tệp nhật ký đầu vào
  • Nó có thể đọc tệp nhật ký .gz / .bz2

    Đầu ra là trên STDOUT, do đó bạn có thể sử dụng nó khá độc đáo trong các quy trình bổ sung.


  • 0

    Dựa trên câu trả lời của @ Ryan, những điều sau đây sẽ giúp có được tất cả các tệp 'cuộn' được sắp xếp theo thứ tự bảng chữ cái, sau đó lấy tệp hiện tại, giải nén chúng, nếu cần và lesschúng:

    cat <(ls mylog.log-* | sort) <(ls mylog.log) | xargs zcat -f | less

    hoặc nếu bạn muốn lấy tất cả chúng dưới dạng một luồng liên tục, bạn có thể sử dụng tailchúng và tùy ý chuyển nó sang một quy trình khác

    cat <(ls mylog.log-* | sort | xargs zcat -f) <(tail -f -n +0 mylog.log)

    Tôi nên lưu ý rằng điều này được thiết kế cho các bản ghi được xoay hàng ngày với ngày được gắn vào cuối tệp. Nếu bạn đăng nhập cho chúng tôi một định dạng khác, bạn sẽ phải sửa đổi phần đầu tiên của catcâu lệnh để phù hợp.

    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.