web-dev-qa-db-ja.com

フォルダー内のgzip圧縮されたファイル内の文字列を検索します

私の現在の問題は、gzip圧縮されたファイルを含む約10個のフォルダーがあることです(それぞれ平均5個)。これにより、50個のファイルを開いて表示できます。

フォルダー内のgzip圧縮されたファイルに特定のパターンがあるかどうかを確認する簡単な方法はありますか?

zcat ABC/myzippedfile1.txt.gz | grep "pattern match"
zcat ABC/myzippedfile2.txt.gz | grep "pattern match"

スクリプトを記述する代わりに、すべてのフォルダーとサブフォルダーに対して同じことを1行で行うことはできますか?

for f in `ls *.gz`; do echo $f; zcat $f | grep <pattern>; done;
44
gagneet

zgrepはgzip圧縮されたファイルを検索し、-R再帰オプションを持ち、-Hはファイル名オプションを表示します。

zgrep -R --include=*.gz -H "pattern match" .
50
Ned Batchelder

zgrepzegrep。があるため、ここではzcatは不要です。

ディレクトリ階層でコマンドを実行する場合は、find:を使用します

find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;

また、「ls *.gz”はforでは役に立たないので、将来は単に "* .gz"を使用する必要があります。

20
Nietzche-jou

zgrepが-Rをサポートしない方法

「Nietzche-jou」の解決策はより良い答えになると思いますが、オプション-Hを追加してファイル名を次のように表示します

find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
8
Francisco Lavin

findコマンドを使用します

find . -name "*.gz" -exec zcat "{}" + |grep "test"

または、zcatの再帰オプション(-r)を使用してみてください

7
ghostdog74

これに少し遅れて来て、同様の問題があり、使用して解決することができました。

zcat -r /some/dir/here | grep "blah"

ここで詳しく説明します。

http://manpages.ubuntu.com/manpages/quantal/man1/gzip.1.html

ただし、これは結果が一致した元のファイルを表示せず、代わりに「(標準入力)」をパイプから入ってくるように表示します。 zcatは名前の出力もサポートしていないようです。

パフォーマンスに関しては、これが得られたものです。

$ alias dropcache="sync && echo 3 > /proc/sys/vm/drop_caches"

$ find 09/01 | wc -l
4208

$ du -chs 09/01
24M

$ dropcache; time zcat -r 09/01 > /dev/null
real    0m3.561s

$ dropcache; time find 09/01 -iname '*.txt.gz' -exec zcat '{}' \; > /dev/null
0m38.041s

ご覧のとおり、少量のファイルを扱う場合でも、find|zcatメソッドの使用はzcat -rの使用よりも大幅に遅くなります。また、zcatにファイル名を出力させることもできませんでした(-vを使用すると、明らかにファイル名が出力されますが、すべての行に出力されるわけではありません)。現在、grepで速度と名前の一貫性の両方を提供するツール(つまり、-Hオプション)はないようです。

結果が属するファイルの名前を特定する必要がある場合は、独自のツールを記述する必要があります(50行のPythonコード)で行うか、または遅い方法:名前を識別する必要がない場合は、zcat -rを使用します。

お役に立てれば

6
sleepycal

find . -name "*.gz"|xargs zcat | grep "pattern"すべきです。

2
Ajit Kumar

zgrep "string" ./*/*

上記のコマンドを使用して、stringディレクトリの.gzファイルでdirを検索できます。ここで、dirは次のサブディレクトリ構造を持ちます。

/dir
    /childDir1
              /file1.gz
              /file2.gz
    /childDir2
              /file3.gz
              /file4.gz
    /childDir3
              /file5.gz
              /file6.gz
1
todipratik