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: