
設定: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
最も一般的な場合は、結果を変数に保存しないことをお勧めします。これにより、ギガバイトのデータが返される可能性があります(私たちはこれを知らない)。
答え2
まず、結果をgrep
変数に割り当てることができます。その後、コメントで@Markが提案したように終了コードを確認するか、次のように結果が空の文字列であるかどうかを確認できます。
foo=$(grep $PATTERN $sourcefile)
if [ ! -z "$foo" ]
then
echo "$foo" | gzip > compressedfile.gz
fi
または文章で:
foo=$(grep $PATTERN $sourcefile); [ -z "$foo" ] || echo "$foo" | gzip > compressedfile.gz