De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


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.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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