私の現在の問題は、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;
zgrepはgzip圧縮されたファイルを検索し、-R再帰オプションを持ち、-Hはファイル名オプションを表示します。
zgrep -R --include=*.gz -H "pattern match" .
zgrepとzegrep。があるため、ここではzcatは不要です。
ディレクトリ階層でコマンドを実行する場合は、find:を使用します
find . -name "*.gz" -exec zgrep ⟨pattern⟩ \{\} \;
また、「ls *.gz
”はforでは役に立たないので、将来は単に "* .gz"を使用する必要があります。
zgrepが-Rをサポートしない方法
「Nietzche-jou」の解決策はより良い答えになると思いますが、オプション-Hを追加してファイル名を次のように表示します
find . -name "*.gz" -exec zgrep -H 'PATTERN' \{\} \;
findコマンドを使用します
find . -name "*.gz" -exec zcat "{}" + |grep "test"
または、zcatの再帰オプション(-r)を使用してみてください
これに少し遅れて来て、同様の問題があり、使用して解決することができました。
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
を使用します。
お役に立てれば
find . -name "*.gz"|xargs zcat | grep "pattern"
すべきです。
zgrep "string" ./*/*
上記のコマンドを使用して、string
ディレクトリの.gzファイルでdir
を検索できます。ここで、dir
は次のサブディレクトリ構造を持ちます。
/dir
/childDir1
/file1.gz
/file2.gz
/childDir2
/file3.gz
/file4.gz
/childDir3
/file5.gz
/file6.gz