Apakah ada alat yang menggabungkan zcat dan cat secara transparan?

71

Saat menangani file log, beberapa berakhir sebagai file gzip terima kasih logrotatedan yang lainnya tidak. Jadi ketika Anda mencoba sesuatu seperti ini:

$ zcat *

Anda berakhir dengan baris perintah seperti zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gzdan kemudian dengan:

gzip: xyz.log: not in gzip format

Apakah ada alat yang akan mengambil byte ajaib, mirip dengan cara filekerjanya, dan menggunakan zcatatau cattergantung pada hasilnya sehingga saya dapat menyalurkan output ke grepmisalnya?

NB: Saya tahu saya bisa skrip itu, tapi saya bertanya apakah sudah ada alat di sana.

0xC0000022L
sumber

Jawaban:

41

zless

Sayang sekali zcat, karena libz memiliki API yang mendukung pembacaan dari file terkompresi dan tidak terkompresi secara transparan. Tetapi halaman manual mengatakan bahwa zcatitu setara dengan gunzip -c.

sourcejedi
sumber
Terima kasih atas alternatif ini. Saya bisa memikirkan itu, bukan? ;) ... Baiklah. Temukan, +1 dan terima (juga karena Anda memiliki lebih sedikit perwakilan daripada penjawab lainnya).
0xC0000022L
Luar biasa. Banyak membantu saya, saya menggunakan shell script untuk menyelesaikannya selama bertahun-tahun ... atau skrip perl yang mengerikan ... log resolge merger, digunakan oleh awstats ... sekarang saya tahu alat yang luar biasa ini. Terima kasih.
Luciano Andress Martini
99

Cobalah dengan -fatau --force:

zcat -f -- *

Karena zcathanya skrip sederhana yang berjalan

exec gzip -cd "$@"

dengan opsi panjang yang akan diterjemahkan

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

dan, sesuai dengan man gzip(menekankan milikku):

-f - Angkatan
      Paksa kompresi atau dekompresi bahkan jika file memiliki banyak tautan
      atau file yang sesuai sudah ada, atau jika data yang dikompresi adalah
      membaca dari atau ditulis ke terminal. Jika input data tidak dalam format
      dikenali oleh gzip, dan jika opsi --stdout juga diberikan, salin
      input data tanpa perubahan ke output standar: biarkan zcat berperilaku seperti kucing .

Juga:

sehingga saya bisa menyalurkan output ke grepmisalnya

Anda bisa menggunakannya zgrepuntuk itu:

zgrep -- PATTERN *

namun lihat komentar Stéphane di bawah ini.

don_crissti
sumber
1
Terima kasih, itu alternatif yang menarik untuk zlesssolusinya. Bagus dan +1.
0xC0000022L
6
Perhatikan bahwa keduanya zlessdan zgrepskrip yang melakukan panggilan gzip -cdfq(yaitu zcat -fq).
Stéphane Chazelas
9

Saya menggunakan tepat untuk tujuan yang sama:

{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....
Washuu
sumber
Saya suka pendekatan ini karena, membutuhkan waktu paling sedikit dihabiskan untuk mendidik rekan kerja. Jika pesan log memiliki stempel waktu di stempel waktu ramah-sortir, ini sangat berguna.
Thomas L Holaday
Pendekatan yang sangat baik. Terima kasih.
Miloš Đakonović
7

Ada pengganti drop-in untuk ztools (zcat, zgrep, ..) yang disebut zutils yang menyatukan semua alat dekompresi secara independen dari backend. Jadi dengan perintah yang sama Anda dapat membaca file polos, lzma, gzip, xz secara transparan.

Ini tersedia dalam debian wheezy atau yang lebih baru, mungkin dalam redhat / centos juga.

Halaman proyek ada di sini nongnu.org

Posting blog yang menjelaskan penggunaan utilitas di sini ( noone.org )

aseques
sumber
3

Ini berfungsi dengan baik di RHEL 5.x di mana zcat adalah biner. Gagal di RHEL 6.x (dan Ubuntu 12.x) di mana zcat adalah skrip. Ini digunakan untuk bekerja dengan baik.

Saya tidak akan menggunakan zcat sama sekali tetapi zgrep tidak akan menangani file yang tidak terkompresi dengan baik.

Peter Laws
sumber
2

Membuka kompresi dan non-kompresi, dalam urutan kronologis.

ls -v syslog* | tac | xargs zcat -f | less
Ryan
sumber
Ini memberi urutan yang salah dengan lebih dari sepuluh file log (syslog.10.gz ...)
Vanni
Tangkapan yang bagus. -v harus memperbaikinya.
Ryan
ls -rvuntuk menghindari tac. Untuk file log, less $(ls -rv syslog*)dengan LESSOPENenv var Anda diatur dengan benar berfungsi dengan baik. Anda dapat melakukan pencarian di seluruh file dengan esc-nuntuk menemukan kecocokan berikutnya, mengabaikan batas-batas file.
Peter Cordes
Dengan zsh:zcat -f syslog*(nOn)
Stéphane Chazelas
Ini tidak berfungsi jika Anda mengatur putaran rotate untuk dikompres pada hari berikutnya
cjbarth
1

Bagaimana dengan pembungkus?

$ 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
Penyembunyian
sumber
0

Salin dan tempel (atau letakkan di akhir ~/.bashrcfile Anda ) fungsi bash ini :

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

Sekarang Anda dapat mengetik misalnya logs /var/log/syslogatau logs /var/log/nginx/access.loguntuk melihat semua yang syslog atau nginx pesan log dari yang terlama ke terbaru dengan kurang .

Anda kemudian dapat mencari sesuatu yang diketik /somethingdan dipukul nuntuk selanjutnya .

Vanni
sumber
0

Ada skrip perl yang indah tepat melakukan ini. Ini logresolvemerge.pl dari proyek awstats: http://www.awstats.org/docs/awstats_tools.html

Logresolvemerge memungkinkan Anda untuk mendapatkan satu file log keluaran unik, diurutkan pada tanggal, dibangun dari sumber-sumber tertentu:

  • Itu dapat membaca beberapa file log input
  • Itu dapat membaca file log .gz / .bz2

    Outputnya adalah pada STDOUT, sehingga Anda dapat menggunakannya dengan cukup baik dalam proses tambahan.

  • Daniel Andersen
    sumber
    0

    Berdasarkan jawaban @ Ryan, yang berikut ini akan mendapatkan semua file yang 'digulung' diurutkan sesuai abjad, lalu dapatkan file saat ini, hapus kompresinya, jika diperlukan, dan lessmereka:

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

    atau jika Anda ingin mendapatkan semuanya sebagai aliran berkelanjutan, Anda dapat tailmelakukannya, dan secara opsional mengirimkannya ke proses lain

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

    Saya harus mencatat bahwa ini dirancang untuk log yang diputar setiap hari dengan tanggal yang ditambahkan ke akhir file. Jika log Anda kami format yang berbeda, Anda harus memodifikasi bagian pertama dari catpernyataan untuk mengakomodasi.

    cjbarth
    sumber