ログファイルを処理するとき、一部はlogrotate
のおかげでgzip圧縮されたファイルになり、他のファイルはそうではありません。したがって、次のようなことを試みると、
$ zcat *
あなたはzcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gz
のようなコマンドラインで終わり、次に:
gzip: xyz.log: not in gzip format
file
の動作と同様に、マジックバイトを取得し、結果に応じてzcat
またはcat
を使用して、たとえばgrep
にパイプで出力できるツールはありますか?
注意:私はそれをスクリプト化できることを知っていますが、私はすでにそこにツールがあるかどうかを尋ねています。
zless
Libzには、圧縮ファイルと非圧縮ファイルの両方からの透過的な読み取りをサポートするAPIがあるため、zcat
は残念です。しかし、マンページには、zcat
はgunzip -c
と同等であると記載されています。
-f
または--force
でお試しください:
zcat -f -- *
zcat
は実行する単純なスクリプトなので
exec gzip -cd "$@"
に変換される長いオプション
exec gzip --stdout --decompress "$@"
そして、man gzip
に従って(鉱山を強調):
-f --force ファイルに複数のリンクがある場合や、対応するファイルがすでに存在する場合、または圧縮されたデータが端末から読み取られたり書き込まれたりした場合でも、強制的に圧縮または解凍します。 入力データがgzipで認識される形式 ではなく、オプション--stdoutも指定されている場合は、 入力データを変更せずに標準出力にコピーします。 zcatに猫として振る舞わせる。
また:
出力を
grep
にパイプできるように
そのためにzgrep
を使用できます。
zgrep -- PATTERN *
ただし、以下のステファンのコメントを参照してください。
私はまったく同じ目的で使用します:
{ cat /var/log/messages ; zcat /var/log/messages*.gz ; }| grep something | grep "something else" ....
バックエンドとは無関係にすべての解凍ツールを統合するzutilsと呼ばれるztools(zcat、zgrep、..)のドロップイン置き換えがあります。したがって、同じコマンドを使用して、プレーン、lzma、gzipped、xzファイルを透過的に読み取ることができます。
Debian wheezy以降で利用できます。おそらくredhat/centosでも利用できます。
プロジェクトのページはこちら nongnu.org
ここでユーティリティの使用法を説明するブログ投稿( noone.org )
これは、zcatがバイナリであるRHEL 5.xで正常に機能します。 zcatがスクリプトであるRHEL 6.x(およびUbuntu 12.x)では失敗します。これはsedで正常に動作します。
私はzcatをまったく使用しませんが、zgrepは非圧縮ファイルも適切に処理しません。
時系列で圧縮と非圧縮の両方を開きます。
ls -v syslog* | tac | xargs zcat -f | less
ラッパーはどうですか?
$ 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
次のbash関数をコピーして貼り付けます(または~/.bashrc
ファイルの最後に貼り付けます)。
logs() { zcat -f $(ls -rv "$1"*) | less; }
これで、たとえばlogs /var/log/syslog
またはlogs /var/log/nginx/access.log
と入力して、all thesyslogまたはnginxlessを使用して、メッセージを古いものから新しいものにログします。
次に、somethingを検索して、/something
と入力し、n
を押してnext。
これを正確に行う美しいPerlスクリプトがあります。これは、awstatsプロジェクトのlogresolvemerge.plです。 http://www.awstats.org/docs/awstats_tools.html
Logresolvemergeを使用すると、特定のソースから構築された、日付順にソートされた1つの一意の出力ログファイルを取得できます。
出力はSTDOUTにあるため、追加のプロセスで非常にうまく利用できます。
@Ryanの答えに基づいて、次のコードはすべての「ロール」ファイルをアルファベット順に並べ替えて取得し、現在のファイルを取得し、必要に応じて解凍し、less
します。
cat <(ls mylog.log-* | sort) <(ls mylog.log) | xargs zcat -f | less
または、すべてを連続ストリームとして取得したい場合は、それらをtail
し、オプションでそれを別のプロセスにパイプすることができます。
cat <(ls mylog.log-* | sort | xargs zcat -f) <(tail -f -n +0 mylog.log)
これは、ファイルの末尾に日付が追加されて毎日ローテーションされるログ用に設計されていることに注意してください。ログに別のフォーマットが記録されている場合は、対応するようにcat
ステートメントの最初の部分を変更する必要があります。