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

答え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

関連情報