for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
case $filename in
*.gz) g=zgrep ;;
*.bz2) g=bzgrep ;;
*.xz) g=xzgrep ;;
*) printf 'Unknown filetype for "%s"\n' "$filename" >&2
exit 1 # or continue or break
esac
"$g" 'Cannot .*TLS' "$filename"
done
Cada ferramenta de compactação vem com uma ferramenta grep correspondente. Estes são, para gzip , bzip2 e xz , chamados zgrep , bzgrep e xzgrep , respectivamente. Ao usá-los, não é necessário descompactar e recompactar os arquivos explicitamente.
O script acima seleciona o grep correto, dependendo do sufixo do arquivo. Pode-se usar indiscutivelmente grep para qualquer sufixo desconhecido. Veja abaixo como fazer isso sem observar os sufixos de nome de arquivo (usando a ferramenta file ).
Note como nós não precisamos usar ls para fazer um loop sobre o conjunto de arquivos, e que as expansões de variáveis precisam ser duplamente citadas.
Eu ignorei as chamadas sed que você tem em seu código, pois não sei qual é o propósito delas. Também removi o exit 0 no final do código, pois isso mascararia qualquer outro status de saída do script se ele saísse do loop.
Usando o tipo MIME de um arquivo para selecionar a ferramenta correta grep :
for filename in "$HOST-mail-2018$1"[0-9][0-9]*; do
case $( file -b -i "$filename" ) in
text/plain*) g=grep ;;
application/x-gzip*) g=zgrep ;;
application/x-bzip2*) g=bzgrep ;;
application/x-xz*) g=xzgrep ;;
*) printf 'Unknown filetype for "%s"\n' "$filename" >&2
exit 1 # or continue or break
esac
"$g" 'Cannot .*TLS' "$filename"
done
Isso selecionaria corretamente a ferramenta grep correta, independentemente do sufixo do nome do arquivo (desde que o arquivo fosse de um dos tipos de arquivos suportados). Eu também adicionei grep para arquivos de texto comuns.
Relacionados: