você está aqui: Home  → Arquivo de Mensagens

Usando o ack ao invés do grep

Colaboração: André Leon S. Gradvohl

Data de Publicação: 18 de setembro de 2014

Tenho colaborado com outros desenvolvedores em um código fonte de um sistema distribuído feito em Java. O código desse sistema é muito grande, possui muitas classes e quem conhece Java sabe que essas classes ficam espalhadas em muitos arquivos.

As vezes preciso observar como foi utilizado um método de um objeto, mas nem sempre me lembro em que classe esse objeto foi usado. Até pouco tempo, eu usava o grep. Porém, a quantidade de parâmetros que eu tinha que passar para o grep estavam começando a aumentar muito em função das especificidades da minha busca e da quantidade de arquivos que o sistema tinha.

Daí, pesquisando sobre uma forma mais eficiente de fazer essa busca, encontrei o ack. Como o próprio autor do software afirma, o ack foi projetado para programadores com grandes árvores de código-fonte heterogêneos.

Basicamente, o ack substitui o grep ao fazer uma busca por uma determinada string nos arquivos de toda uma árvore de diretórios. Para mim, as vantagem são que, por default, os resultados do ack são coloridos e indicam as linhas onde a string indicada foi encontrada em cada arquivo.

Vejamos um exemplo. Considere o comando a seguir

  ack PolicyRules 

Esse comando vai procurar a string PolicyRules em todos os arquivos do diretório corrente e de todos os diretórios abaixo do nível atual.

O resultado é o seguinte (limitei a poucas linhas apenas para ilustração):

  seep-system/src/main/java/uk/ac/imperial/lsds/seep/api/QueryPlan.java 
  25:import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.PolicyRules; 
  53:    private PolicyRules policyRules; 
  255:    public void withPolicyRules(PolicyRules rules) { 
  260:    public PolicyRules getPolicyRules() { 
  
  seep-system/src/main/java/uk/ac/imperial/lsds/seep/api/QueryBuilder.java 
  18:import uk.ac.imperial.lsds.seep.infrastructure.monitor.policy.PolicyRules; 
  78:    public static void withPolicyRules(PolicyRules rules) { 
  79:        qp.withPolicyRules(rules); 

No meu caso, para aumentar a velocidade da busca, eu a limito aos arquivos .java. A sintaxe fica assim:

  ack --java PolicyRules 

Para reduzir o número de diretórios, posso, por exemplo, informar para o ack ignorar o diretório test da seguinte forma:

  ack --java --ignore-dir test PolicyRules 

Além de arquivos Java, o ack faz buscas em outros tipos de arquivos pré-definidos, por exemplo C++ (inclui .cpp, .cc, .cxx, .m, .hpp, .hh, .h, .hxx), C (inclui .c, .h, .xs), Fortran (inclui .f, .f77, .f90, .f95, .f03, .for, .ftn, .fpp), dentre outros tipos.

Salvo engano, o ack já vem por padrão no Debian. Mas, você pode obter detalhes sobre o ack e como instalá-lo no site a seguir:

Ack!

A propósito, um Easter Egg para os fans de Star Wars e do Almirante Ackbar: execute o programa da seguinte forma

  ack --bar 

É isso.

André Leon S. Gradvohl é docente na Faculdade de Tecnologia da UNICAMP. Atualmente ele está realizando Pós-doutorado na França no Laboratoire d'Informatique de Paris 6 (LIP6), na área de Sistemas Distribuídos.


Veja a relação completa dos artigos de André Leon S. Gradvohl

 

 

Opinião dos Leitores

Daniel Romero
19 Set 2014, 15:37
Legal, já conhecia o ack, depois dele mudei para o "ag": https://github.com/ggreer/the_silver_searcher vale conferir ;)
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script