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