Zgrep recursivo não funciona

7

Eu tenho uma hierarquia de diretórios que contém numerosos .gz arquivos. Eu quero ser capaz de recursivamente grep-los para a string "foo". Pelo que li on-line, o seguinte deve funcionar:

zgrep -R -H "foo" .

No entanto, isso nunca retorna nenhum resultado. Se eu substituir o ponto pelo nome de um arquivo, ele funciona. Por exemplo,

zgrep -R -H "foo" myFile.gz

no entanto, obviamente, isso não será mais recursivo.

Eu sei que "foo" está em alguns dos arquivos porque o seguinte comando retorna muitos resultados:

find . -iname "*.gz" | xargs zgrep "output" | less

Alguém sabe porque meu comando zgrep recursivo não está funcionando. Estou em uma caixa linux RHEL

Nosrettap
fonte

Respostas:

3

Você está quase lá. Tente isto:

zgrep -R -H "foo" *.gz

EDITAR: Hmmmm .... intrigante!

De acordo com o meu zgrep, -R (recursivo) não é uma opção. Simplesmente não é suportado. Eu tenho um cheque para ver o que a página de manual do seu zgrep diz.

Uma alternativa, que depende de apenas um nível de subdiretórios, é fazer isso:

zcat */*.gz | grep <needle>

Mas eu sugiro que seu comando de busca seja provavelmente melhor!

GeoSword
fonte
Quando tento isso, obtenho: zsh: no matches found: *.gz
Nosrettap
3

Você tem que instalar zutils. Isso substituirá o zgrep padrão e limitado do sistema por um sistema recursivo.

Nos sistemas baseados no Debian, você executa apt-get install zutils então você pode zgrep -rH myword . e use a maioria dos outros parâmetros do grep que você conhece e ama.

nzn
fonte
Olá, eleitor de baixo. Adoraria saber por que isso não é uma boa ideia. Eu pessoalmente usei e achei ótimo.
nzn
(+1) Não tenho certeza porque o voto para baixo. Para os interessados, há uma boa explicação sobre a versão zutils vs a versão gzip do zgrep aqui: unix.stackexchange.com/questions/187742/…
lepe
2

A maneira que eu costumo fazer é:

zgrep "foo" $(find -name "*.gz")

Se esse comando retornar "Argument list too long", tente desta forma:

for I in $(find -name "*.gz"); do zgrep "foo" $I; done
lepe
fonte
0

Usar peneirar - Está Super rápido .

sift -z foo

-z é para descompactar gzips, ele desce em subdiretórios por padrão. Mostra nomes de arquivos também por padrão -H opção).

PS. Graças à sua pergunta, descobri essa ferramenta hoje. Apenas battletested-lo, além da funcionalidade que você precisa, eu tenho uma aceleração de 5x em alguns logs de produção quando se compara a zgrep.

Wojciech Kaczmarek
fonte