web-dev-qa-db-ja.com

再帰的なzgrepが機能しない

多数の.gzファイルを含むディレクトリ階層があります。文字列「foo」に対して再帰的にgrepできるようにしたい。私がオンラインで読んだことから、以下が機能するはずです:

zgrep -R -H "foo" .

ただし、これは結果を返しません。ドットをファイルの名前に置き換えても機能します。例えば、

zgrep -R -H "foo" myFile.gz

ただし、明らかに、これは再帰的ではなくなります。

次のコマンドは多くの結果を返すため、一部のファイルに「foo」が含まれていることがわかります。

find . -iname "*.gz" | xargs zgrep "output" | less

再帰的なzgrepコマンドが機能しない理由を誰かが知っていますか? RHEL Linuxボックスにいます

10
Nosrettap

私が通常行う方法は次のとおりです。

zgrep "foo" $(find -name "*.gz")

そのコマンドが「引数リストが長すぎます」を返す場合は、次の方法を試してください。

for I in $(find -name "*.gz"); do zgrep "foo" $I; done
5
lepe

あなたのほとんどそこに。これを試して:

zgrep -R -H "foo" *.gz

編集:うーん....興味をそそる!

私のzgrepによれば、-R(再帰的)はオプションではありません。単にサポートされていません。あなたのzgrepのmanページが何を言っているかを確認するためのIDがあります。

サブディレクトリの1つのレベルのみに依存する1つの代替策は、これを行うことです。

zcat */*.gz | grep <needle>

しかし、私はあなたのfindコマンドがおそらくより良いことをお勧めします!

4
GeoSword

Zutilsをインストールする必要があります。これにより、システムのデフォルトの制限されたzgrepが再帰可能なzgrepに置き換えられます。

Debianベースのシステムではapt-get install zutilsを実行すると、zgrep -rH myword .を実行して、知っているgrepの他のほとんどのパラメーターを使用できます。

4
nzn

sift を使用します- super-fast です。

sift -z foo

-zはgzipを解凍するためのもので、デフォルトではサブディレクトリに格納されます。デフォルトでファイル名も表示します(your -Hオプション)。

PS。あなたの質問のおかげで、今日このツールを発見しました。必要な機能を除いて、それをバトルテストしただけですが、zgrepと比較すると、一部の本番ログで5倍のスピードアップがあります。

0