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 POSIXsh
padrão. Você tem a opção de alterar seu she-bang para#! /usr/xpg4/bin/sh -
para obter umsh
padrã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,
zcat
apenas processa.Z
arquivos compactados porcompress
como eram nos tempos antigos. Você precisa invocargzip
para.gz
arquivos. - Por padrão, você não precisa necessariamente de utilitários padrão. Por exemplo, o padrão
grep
in/usr/bin
é antigo e não suporta a opção-q
padrão. Para obter os utilitários padrão, você precisa atualizar$PATH
com 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