grep PATTERN arquivo, gzip quando existe padrão mais não fazer nada

3

Configuração: Linux GNU bash, versão 4.3

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

Eu quero evitar ter que acessar o arquivo de origem duas vezes.

Como posso conseguir isso?

    
por Dennis Nolte 26.04.2018 / 11:50

2 respostas

2
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).

    
por 26.04.2018 / 12:18
1

Você pode primeiro atribuir o resultado de grep a uma variável. Então você pode verificar o código de saída, como sugerido por @Mark nos comentários, ou verificar se o resultado é a string vazia, como esta:

foo=$(grep $PATTERN $sourcefile)
if [ ! -z "$foo" ]
then
        echo "$foo" | gzip > compressedfile.gz
fi

ou, como um one-liner:

foo=$(grep $PATTERN $sourcefile); [ -z "$foo" ] || echo "$foo" | gzip > compressedfile.gz
    
por 26.04.2018 / 12:09