Saat menangani file log, beberapa berakhir sebagai file gzip terima kasih logrotate
dan 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.gz
dan kemudian dengan:
gzip: xyz.log: not in gzip format
Apakah ada alat yang akan mengambil byte ajaib, mirip dengan cara file
kerjanya, dan menggunakan zcat
atau cat
tergantung pada hasilnya sehingga saya dapat menyalurkan output ke grep
misalnya?
NB: Saya tahu saya bisa skrip itu, tapi saya bertanya apakah sudah ada alat di sana.
text-processing
cat
gzip
0xC0000022L
sumber
sumber
Cobalah dengan
-f
atau--force
:Karena
zcat
hanya skrip sederhana yang berjalandengan opsi panjang yang akan diterjemahkan
dan, sesuai dengan
man gzip
(menekankan milikku):Juga:
Anda bisa menggunakannya
zgrep
untuk itu:namun lihat komentar Stéphane di bawah ini.
sumber
zless
solusinya. Bagus dan +1.zless
danzgrep
skrip yang melakukan panggilangzip -cdfq
(yaituzcat -fq
).Saya menggunakan tepat untuk tujuan yang sama:
sumber
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 )
sumber
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.
sumber
Membuka kompresi dan non-kompresi, dalam urutan kronologis.
sumber
ls -rv
untuk menghindaritac
. Untuk file log,less $(ls -rv syslog*)
denganLESSOPEN
env var Anda diatur dengan benar berfungsi dengan baik. Anda dapat melakukan pencarian di seluruh file denganesc-n
untuk menemukan kecocokan berikutnya, mengabaikan batas-batas file.zsh
:zcat -f syslog*(nOn)
Bagaimana dengan pembungkus?
sumber
Salin dan tempel (atau letakkan di akhir
~/.bashrc
file Anda ) fungsi bash ini :Sekarang Anda dapat mengetik misalnya
logs /var/log/syslog
ataulogs /var/log/nginx/access.log
untuk melihat semua yang syslog atau nginx pesan log dari yang terlama ke terbaru dengan kurang .Anda kemudian dapat mencari sesuatu yang diketik
/something
dan dipukuln
untuk selanjutnya .sumber
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:
Outputnya adalah pada STDOUT, sehingga Anda dapat menggunakannya dengan cukup baik dalam proses tambahan.
sumber
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
less
mereka:cat <(ls mylog.log-* | sort) <(ls mylog.log) | xargs zcat -f | less
atau jika Anda ingin mendapatkan semuanya sebagai aliran berkelanjutan, Anda dapat
tail
melakukannya, dan secara opsional mengirimkannya ke proses laincat <(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
cat
pernyataan untuk mengakomodasi.sumber