grep 'PATTERN' "$sourcefile" >compressedfile
if [ -s compressedfile ]; then
gzip -f compressedfile
else
rm -f compressedfile
fi
O teste -s será verdadeiro se o nome de arquivo fornecido existir e se se referir a um arquivo cujo tamanho é maior que zero. O arquivo irá existir (um redirecionamento sempre criará o arquivo se ele ainda não existir) e o tamanho será maior que zero se houver algum resultado do grep .
O sinal -f to gzip força a compactação, mesmo se o arquivo crescer (o que seria feito se fosse pequeno para começar).
A mesma coisa, quase (já que não comprimirá a saída grep se algum tipo de erro de leitura / gravação ocorrer por grep ), mas usando o status de saída de grep :
if grep 'PATTERN' "$sourcefile" >compressedfile; then
gzip -f compressedfile
else
rm -f compressedfile
fi
ou apenas
grep 'PATTERN' "$sourcefile" >compressedfile && gzip -f compressedfile
rm -f compressedfile
Aqui, rm tentará remover o arquivo descompactado, mas como estamos usando rm -f , nenhum erro será informado se o arquivo não existir (não existirá se gzip tiver sido compactado isso.
No caso mais geral, aconselho não armazenar o resultado de grep em uma variável, pois isso pode retornar gigabytes de dados (não sabemos disso).