grep PATTERNファイル、パターンが存在する場合はgzip、他の操作は実行しません

grep PATTERNファイル、パターンが存在する場合はgzip、他の操作は実行しません

設定:Linux GNU bash、バージョン4.3

if grep -c PATTERN $sourcefile
then
     grep PATTERN $sourcefile | gzip  > compressedfile.gz
fi

ソースファイルに2回アクセスする必要がないようにしたいと思います。

どうすればいいですか?

ベストアンサー1

grep 'PATTERN' "$sourcefile" >compressedfile
if [ -s compressedfile ]; then
    gzip -f compressedfile
else
    rm -f compressedfile
fi

-s与えられたファイル名が存在し、それが参照するファイルのサイズがゼロより大きい場合、テストは真です。ファイルが存在し(存在しない場合、リダイレクトは常にファイルを生成します)grep

-fこのフラグは、ファイルが大きくなっても圧縮を強制します(最初から小さい場合は実行されます)。gzip

grepほぼ同じですが(読み取り/書き込みエラーが発生した場合は出力を圧縮しないためgrep)、終了ステータスを使用してくださいgrep

if grep 'PATTERN' "$sourcefile" >compressedfile; then
    gzip -f compressedfile
else
    rm -f compressedfile
fi

そうでなければ

grep 'PATTERN' "$sourcefile" >compressedfile && gzip -f compressedfile
rm -f compressedfile

ここではrm、とにかく圧縮されていないファイルを削除しようとしますが、使用しているため、rm -fファイルが存在しなくてもエラーは報告されません(gzipファイルが圧縮されている場合は存在しません)。


grep最も一般的な場合は、結果を変数に保存しないことをお勧めします。これにより、ギガバイトのデータが返される可能性があります(私たちはこれを知らない)。

おすすめ記事