shell script limpando buffer

1. shell script limpando buffer

Bruno Santana
bruno_r_santana

(usa Ubuntu)

Enviado em 20/10/2011 - 18:08h

Olá,

Tenho um problema quando preciso dar um grep em uma pasta com muitos arquivos, tipo quando a pasta tem uns 5 GB ou mais o processo do grep é morto assim:

-bash-4.1$ grep -ri --color texto .
Killed

Creio que o próprio sistema operacional mate o processo, se alguém souber melhor o que ocorre me explique por favor.

Mas esse post é porque queria ajudar para contornar esse problema. Acho que o grep vai armazenando um monte de coisa em buffer e por usar muita memória RAM o processo é morto.

Saberiam como criar um Shell script que procura um determinado texto dentro dos arquivos de uma pasta(de forma recursiva) mas que fosse limpando o buffer para esse processo não ser morto?

Obrigado, estou meio perdido, qualquer informação é válida. valeu!


  


2. Re: shell script limpando buffer

Rafael Poletto
polettin

(usa Debian)

Enviado em 20/10/2011 - 21:56h

cara.. tenta fazer o seguinte

find <diretorio> -iname * -exec cat {} | grep <texto> \;


glossário do comando

find = comando de busca
-iname = arquivos que contenham qualquer relaçao com o especificado a seguir, no caso *
-exec = fara com que execute o proximo comando em cada resultado
cat = leitura de arquivos
{} = para cada resultado obtido
| = acrescentar filtros
grep = vai filtar cada arquivo que tiver a palavra espeficicada no <texto>
\; = para finalizar o comando




3. não filtrou

Bruno Santana
bruno_r_santana

(usa Ubuntu)

Enviado em 21/10/2011 - 09:04h

Olá,

Obrigado pela resposta mas não foi possível depois de abrir os arquivos filtrar a saída, veja o erro:

-bash-4.1$ find . -type f -exec cat '{}' | grep texto \;
find: missing argument to `-exec'
grep: ;: No such file or directory

Assim vai de boa:

find . -type f -exec cat {} \;
find . -iname "*" -type f -exec cat {} \;

Alguma sugestão?

valeu!


4. Re: shell script limpando buffer

DAVISON MARCEL PASQUALINI
fdmarp

(usa Debian)

Enviado em 21/10/2011 - 13:38h

e um:

cat arquivo | grep string

ou ainda:

for arquivo in *
do
cat arquivo | grep string
done

ou

cat * | grep string


ajuda?


5. fiz assim

Bruno Santana
bruno_r_santana

(usa Ubuntu)

Enviado em 23/10/2011 - 02:25h

Obrigado novamente pessoal,

cat arquivo | grep string
Assim teria que filtrar manualmente arquivo por arquivo, então não rola

Vou testar rodar na segunda esse abaixo que sugeriu no servidor para ver se vai:
for arquivo in *; do cat $arquivo | grep linux; done
Mas acho q não vai rolar pq tentei igual esse abaixo e o processo também foi morto:
for FILE in `ls`; do grep -ri 'string' $FILE; done

Esse aqui não rolou:
cat * | grep string
retorna:
Arquivo binário (entrada padrão) coincide com o padrão

Nessa página http://www.unix.com/unix-dummies-questions-answers/99882-execute-find-exec-grep-desending-order.html achei uma solução interessante que usa menos memória e adaptei ela, e funcionou. Ficou assim:

find public_html | while read file ; do grep -ri 186.202.13.6 $file; done | tee mylog.txt

O único problema dessa solução é que quando encontra um nome de pasta com espaço no meio fica dando erro para cada arquivo dentro da pasta, exemplo daria o erro abaixo para cada arquivo da pasta Área de Trabalho:

grep: Área: Arquivo ou diretório não encontrado
grep: de: Arquivo ou diretório não encontrado
grep: Trabalho/Íris/DSC02824.JPG: Arquivo ou diretório não encontrado

Apesar de ter conseguido resolver o problema vou manter esse post aberto porque fiquei curioso para saber se é possível usar -exec + grep. Também queria entender porque o servidor mata o processo e aparece Killed, se é padrão do Linux ou se é algo que foi configurado pelo administrador.

valeu!



6. Problema resolvido.

Edilson Rodrigues de Souza
edilsonsouza

(usa Ubuntu)

Enviado em 17/01/2014 - 11:48h

usa o comando assim
cat file | grep -a "palavra a procura"

Obs:
-a, --text : trata arquivos binários como se fossem arquivos de texto.


7. Re: shell script limpando buffer

Vinicius Miqueloti
Miqueloti

(usa Lubuntu)

Enviado em 04/08/2014 - 15:20h

Seria melhor para a busca recursiva utilizar: grep -R '<valor_procurado>' *


8. Re: shell script limpando buffer

Fernando
phoemur

(usa Debian)

Enviado em 04/08/2014 - 19:45h

A solução para lista de arquivos muito grandes é usar um PIPE pro xargs na minha opinião, ao invés do exec do find, pois o xargs gerencia a memória melhor passando ao grep apenas a quantidade de argumentos que ele pode suportar, não mais nem menos, assim nunca estoura a memória.

ex.:

find . -type f -print0 | xargs -0 grep -ri 186.202.13.6


mas somente se a lista de arquivos for EXTREMAMENTE grande, porque de outra forma o

grep -R '<padrão>' *

é melhor

Quando eu digo EXTREMAMENTE grande, no meu sistema seriam mais do que 2097152 arquivos, mas varia de sistema pra sistema.
No POSIX,você pode conseguir este número com o seguinte comando:


getconf ARG_MAX


que nada mais é do que o número máximo de argumentos que você pode passar pra qualquer programa. Acima dele tem que usar o xargs.

Aqui tem uma explicação disso:
http://www.in-ulm.de/~mascheck/various/argmax/






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts