zcatとcatを透明に組み合わせるツールはありますか?

zcatとcatを透明に組み合わせるツールはありますか?

ログファイルを処理すると、一部はgzipファイルに圧縮されますが、logrotate一部はそうではありません。したがって、次のことを試してみると:

$ zcat *

次のコマンドラインが作成され、zcat xyz.log xyz.log.1 xyz.log.2.gz xyz.log.3.gzその後に次のように表示されます。

gzip: xyz.log: not in gzip format

fileこれがどのように機能するかと同様に、マジックバイトを取得し、結果を使用またはzcat依存して出力をパイプするためのツールがありますか?catgrep

注:スクリプトを書くことができることを知っていますが、そのためのツールがすでにあるかどうかを尋ねたいと思います。

答え1

-fまたは、以下を試してください--force

zcat -f -- *

zcat単に実行される単純なスクリプトだからです。

exec gzip -cd "$@"

長いオプションを次のように変換できます。

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

man gzipそして(強調)によると:

-f--強制
      ファイルに複数のリンクがある場合でも、強制圧縮または解凍
      そのファイルがすでに存在するか圧縮されたデータ
      端末から読み込むか、端末に書き込みます。入力データが特定の形式ではない場合
      --stdout オプションも指定すると、gzip として認識されコピーされます。
      標準出力を変更せずにデータを入力します。zcatが猫のように振る舞う

返品:

これにより、出力をgrepパイプすることができます。

あなたはそれを使用することができますzgrep

zgrep -- PATTERN *

しかし、以下のStéphaneのコメントを参照してください。

答え2

zless

これは不幸なようですzcat。 libzには、圧縮ファイルと圧縮されていないファイルの透過的な読み取りをサポートするAPIがあるためです。しかしマンページzcatにはこれがgunzip -c

答え3

私は同じ目的に使用します:

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

答え4

これはzcatがバイナリであるRHEL 5.xでうまく機能します。 zcatがスクリプトであるRHEL 6.x(およびUbuntu 12.x)では失敗します。これ使用されるスムーズに動作します。

zcatの使い方はまったくわかりませんが、zgrepも圧縮されていないファイルを正しく処理しません。

関連情報