Você pode fazer o trabalho do zgrep manualmente. Como você deseja apenas os nomes dos arquivos, use grep apenas para testar a presença do padrão e imprima o nome do arquivo se o padrão for encontrado.
#!/bin/sh
pattern=$1; shift
PATH='getconf PATH':$PATH # needed on Solaris 10 and earlier
# to get a standard grep
export PATH
found=0
for x do
if case "$x" in
*.gz|*.[zZ]) <"$x" gzip -dc | grep -q -e "$pattern";;
*) <"$x" grep -q -e "$pattern";;
esac
then
found=1
printf '%s\n' "$x"
fi
done
if [ $found -eq 0 ]; then exit 1; fi
Para ser executado como:
that-script 'pattern' file1 file2.gz file3.Z file.*.gz ...
Algumas notas específicas para você executando o Solaris 10 (também se aplicam a versões anteriores e, em alguns aspectos, ao Solaris 11 também).
- nesses sistemas,
/bin/shé um shell Bourne em oposição a um POSIXshpadrão. Você tem a opção de alterar seu she-bang para#! /usr/xpg4/bin/sh -para obter umshpadrão ou restringir-se à antiga sintaxe Bourne como fazemos aqui (portanto, não$(...), nocase $x in (x)...) ( O Solaris 11 agora está usando um shell compatível com POSIX para seu/bin/sh(ksh93)). - nesses sistemas,
zcatapenas processa.Zarquivos compactados porcompresscomo eram nos tempos antigos. Você precisa invocargzippara.gzarquivos. - Por padrão, você não precisa necessariamente de utilitários padrão. Por exemplo, o padrão
grepin/usr/biné antigo e não suporta a opção-qpadrão. Para obter os utilitários padrão, você precisa atualizar$PATHcom os caminhos onde encontrar os utilitários padrão (como saída porgetconf PATH).
Se você quiser exibir o nome do membro do arquivo e o número da linha ou o conteúdo, você precisará obter os dados da linha do grep e o nome do membro do script. Remova a opção -q da invocação de grep e pós-processe seu conteúdo.
#!/bin/ksh
pattern=$1; shift
export PATH="$(getconf PATH):$PATH" # needed on Solaris 10 and earlier
# to get a standard grep
found=0
for x do
case "$x" in
*.gz|*.[zZ]) <"$x" gzip -dc | grep -n -e "$pattern";;
*) <"$x" grep -n -e "$pattern";;
esac | {
filename=$x awk '{print ENVIRON["filename"] ":" $0; found=1}
END {exit(!found)}' && found=1
}
done
if [ $found -eq 0 ]; then exit 1; fi