Como reproduzir a opção --recursive do grep em uma versão antiga do grep

2

Estou trabalhando em um UNIX antigo, cujo grep não possui a opção -r / - recursiva.

Eu preciso encontrar um erro que nosso aplicativo está causando, mas não sei em qual arquivo de log nosso aplicativo está escrevendo erros. No entanto, sei que o arquivo de log está em algum lugar em /opt . Por isso, quero encontrar FooErrorMessage em /opt in *.log . Aqui está o que eu tentei:

find /opt | xargs grep FooErrorMessage

- mas isso não funciona, e eu não sei onde especificar que eu só quero *.log arquivos no comando.

    
por Brighid McDonnell 30.07.2009 / 23:15

9 respostas

5

Você está apenas tentando encontrar todos os arquivos de log em /opt e pesquisá-los por somethnig_I_am_looking_for , certo? Por que não:

find /opt -name '*.log' | xargs grep something

ou

find /opt | grep .log | xargs grep something

?

Ah, e já que não consigo descobrir como comentar sobre as outras respostas: tenha cuidado com * .log, pois o shell interpretará isso como globbing e corresponderá todos os arquivos no diretório atual que terminarem em .log . Você deve usar \ *. Log ou '* .log'

    
por 30.07.2009 / 23:28
4

Cuidado com nomes de arquivos com espaços, como é permitido pelo Unix; xargs vai sufocá-los. Use find /opt -name '*.log' ... -print0 | xargs -0 grep ... , essas opções devem ir juntas.

Além disso, o grep ou o shell podem ter um número limitado de argumentos, e a lista de arquivos retornados pelo find pode exceder esse número. Use a opção -n number de xargs para executar grep por blocos de arquivos número .

    
por 30.07.2009 / 23:58
3

você tem perl?

tente - link

    
por 30.07.2009 / 23:30
1

find /opt -type f -name *.log -print | xargs grep 'something_I_am_looking_for'

    
por 30.07.2009 / 23:27
1

Além de adicionar o "-name '* .log'", tente adicionar -n1 aos xargs.

Talvez seu antigo grep não possa receber vários arquivos de entrada, então -n1 executará o grep para cada um desses arquivos, em vez de passá-los como argumentos de uma só vez

    
por 30.07.2009 / 23:33
1

Você também pode fazer isso com a opção exec para encontrar em vez de xargs

find /opt -exec grep "thing you are looking for" {} \;

    
por 31.07.2009 / 04:56
1

O GNU grep tem sua própria opção "recurse":

 grep -R foo /path/to/directory

Para utilizar arquivos de um determinado padrão, é melhor usar find e xargs :

 find /path/to/directory -name \*.log -print0 | xargs -0 grep foo
    
por 02.08.2009 / 19:58
0
find /opt -name *.log | xargs grep yourstring 
    
por 30.07.2009 / 23:27
0

A menos que você tenha subdiretórios com muitos níveis de profundidade, grep *, grep / e grep / / * é fácil de lembrar e difícil de digitar errado ...

    
por 31.07.2009 / 05:34

Tags