grep – Encontre trechos de código no terminal do Linux


Dia desses, enquanto passava a madrugada trabalhando, percebi que uma das tarefas era encontrar um trecho de código específico em mais de 2.000 arquivos e substituir por outro trecho de código.

O problema é que não havia qualquer indicador óbvio de que o código em questão estaria em qualquer um desses arquivos. Ou seja: eu provavelmente teria que baixar todos para minha máquina via FTP e abri-los para encontrar quais arquivos continham esse bendito trecho. Foi aí que eu me lembrei de um comando simples no Linux que pode ser executado no terminal e é uma mão na roda não só para usuários avançados, mas para qualquer um: o grep!

O grep é um comando com uma função simples: ele procura por trechos de texto (strings) dentro de arquivos ou diretórios e retorna para você em quais arquivos a string foi encontrada, inclusive mostrando a linha em que isso ocorreu. Parece bobo? Pense novamente: as possibilidades com o grep são quase infinitas, mesmo para usuários comuns, e o uso aumenta muito mais quando você resolve uní-lo a outros comandos.

Imagine por exemplo que você queira descobrir rapidamente quais foram os últimos acessos de um número IP específico ao servidor. Em vez de abrir o arquivo de log ou usar uma ferramenta, você pode usar o grep no último arquivo de log de acessos. Pronto, ele te retorna na tela os dados.

Ou digamos que você não seja exatamente um usuário muito organizado e agora precisa encontrar onde está uma informação importante dentro de um documento perdido em meio a centenas de outros documentos. Use o grep.

Ou, por fim, imagine que você seja um sysadmin que precisa urgentemente dormir pelo menos uma hora que seja e tem quase 2000 arquivos para verificar a existência de um possível trecho de código. Use o grep, e vá dormir mais cedo.

E como o grep funciona? No terminal, você pode digitar, por exemplo:

grep "trecho a procurar" arquivo.txt

Ou seja: primeiro o comando grep, logo depois o trecho que você quer encontrar, e por fim o arquivo onde você fará a busca. Embora não seja obrigatório colocar o trecho de busca entre aspas, o ideal é fazer isso sempre, para que o Linux não acabe se confundindo com a sintaxe do comando.

Mas… E se eu quiser procurar em vários arquivos, e não apenas em UM arquivos específico? Não tema, continua simples:

grep "trecho a procurar" *

Com isso, o grep vai procurar o trecho em todos os arquivos do diretório atual. Se você quiser, pode especificar um diretório diferente:

grep "trecho a procurar" /var/www/*

Está ficando divertido, mas você ainda pode melhorar, com o uso de algumas opções de busca. Vamos dizer que você não queira fazer a busca apenas naquele diretório, mas também nos subdiretórios. Use a opção -R.

grep -R "trecho a procurar" /var/www/

Ele vai procurar o trecho em todos os arquivos e diretórios que estejam dentro de /var/www/. Perceba que, dependendo da quantidade de arquivos e do tamanho deles, isso pode levar alguns minutos ou várias horas. Então use essa opção com cuidado. Se você quiser, pode fazer uma busca que não se importe com maiúsculas ou minúsculas usando a opção -i:

grep -i "trecho a procurar" arquivo.txt

Aqui, o grep vai retornar qualquer resultado que bater com o trecho desejado, independente se houverem maiúsculas. Pode ser “Trecho A Procurar” ou “TrReChO a PrOcUrAr” ou qualquer outra combinação. Não fará diferença. Mas você também pode procurar por todos os arquivos ou linhas onde o trecho não aparece. Como? Usando a opção -v

grep -v "trecho a procurar" arquivo.txt

Nesse exemplo, o grep vai retornar qualquer linha do arquivo que não contenha o texto selecionado. Interessante, não? E dá para juntar todas essas opções? Claro que dá!

grep -Riv "trecho a procurar" /var/www/

Já ficou fácil de entender o que essa combinação faz, não? Procura recursivamente dentro da pasta /var/www por todos os arquivos e linhas onde o trecho selecionado não foi encontrado, independente dele ter partes em maiúsculas ou minúsculas.

Podemos melhorar? Podemos. E se o trecho que quisermos procurar existir em muitos arquivos e acabar “estourando” o limite de caracteres do terminal? Ou, melhor: e se quisermos passar o resultado para outra pessoa? É só jogar a saída do grep para um arquivo:

grep "trecho" arquivo.txt > arquivodesaida.txt

Todo o resultado do grep irá para o arquivodesaida.txt, e não para a tela. Assim, você poderá ler com calma, imprimir, enviar para alguém, ou até usar em algum outro script. Outra possibilidade é usar o grep para filtrar a saída de outros comandos. Vamos dizer que eu precise listar a saída do comando ls (muito útil se você está procurando algo específico em uma pasta com muitos arquivos):

ls | grep trecho

E pronto. O ls vai retornar apenas os arquivos que contenham “trecho” no nome. Mais fácil que isso, só se o estagiário fizer pra você!



O grep é uma ferramente poderosa, e aqui cobrimos apenas o básico dela. Se você quiser saber mais, leia o manual do comando, e brinque um pouco na sua instalação Linux. Você vai descobrir possibilidades que tornarão sua vida muito mais fácil. :)

Fonte: Paulo Graveheart ! http://tecnoblog.net

Sobre

32 anos, formado em Ciências da Computação, usuário de Linux e evangelista do Software Livre desde 1997. Comediante Geek e pirata semi-profissional, estuda a internet e as relações sociais dentro dela desde que ouviu o chiado do modem pela primeira vez.

Nenhum comentário

Toda vez que um homem supera os reveses, torna-se mentalmente e espiritualmente mais forte!

Tecnologia do Blogger.