<-- home

Dicas Ack

Neste post quero abordar algumas das funcionalidades do Ack. Não obstante, muito do que aqui se encontra descrito se aplica igualmente para o grep. O Ack foi desenvolvido como uma versão melhorada do grep, focada para programadores.

Ack é escrito em Perl, herdando algumas características, como expressões regulares.

Filtrando por tipo de arquivo

O ack tem um sistema de filtros inteligente. Utiliza-se --extension para filtrar por extensão, e --no-extension para filtrar por tudo menos a extensão especificada.

Exemplo:

ack ... --no-js --no-yaml

Para filtrar por tudo menos javascript e yaml.

ack ... --php --js

Para filtrar por arquivos javascript e php.

Obs: Por default o ack ignora arquivos de versionamento: .git, .svn.

Escape

Para escapar um caractere em uma expressão

ack '\$foo = \$bar'

Para escapar todos os caracteres de uma expressão

ack -Q '$foo = $bar'

Retornando apenas os nomes dos arquivos

A opção -l é muito útil principalmente em conjunto com outros scripts como o sed para substituir o contéudo.

ack -l "$USER" /etc

Pesquisando por palavras “fechadas”

ack -w require

Igualmente possível

ack '\brequire\b'

Visualizando a vizinhança

Em alguns casos é interessante ver além do conteúdo procurado. Dependendo de como ele foi disposto (indentado ou não), o que estamos procurando por vezes está uma ou duas linhas acima ou abaixo.

Para esses casos existe a opção -C num, que permite especificar quantas linhas ao redor do conteúdo encontrado serão mostradas.

Por exemplo, preciso saber quais entradas da classe product não setam o entity manager antes de rodar o build. Se a chamada de build for indentada pode ser que a informação que eu precise esteja algumas linhas abaixo:

ack -C 3 -Q "Inventory\Test\Fixture\Product" module

Vim

O vim e o grep tem um forte relacionamento, tanto que o Vim traz consigo o vim-grep que é o grep utilizando as expressões regulares do Vim. Não obstante vim e ack também tem uma sinergia interessante, cheque este script se quiser algo integrado.

Abrir resultado da busca no vim

Para abrir os arquivos encontrados em uma busca com o ack no vim utilize:

 $ vim -p $(!! -l)

Find

Ack também pode ser usado no lugar do find para simplesmente encontrar arquivos por nome. O find é cheio de idiossincrasias que se devem a sua idade avançada, sendo assim eu acabo utilizando o ack no seu lugar, reciclando o conhecimento.

ack -g 'Product*.php' module/

Ack com pipe

O ack suporta a passagem dos arquivos que serão testados como argumento –files-from, quando setado para - o ack interpreta os valores da entrada padrão, o que permite utilizar o ack com o pipe.

Utilizando em conjunto a opção -g é possível unir vários ack’s, alguns para pegar por nomes de arquivos, outros para filtrar o conteúdo dentro destes arquivos.

ack -g "[^A-Za-z]tests" module/ | ack --files-from=- "Category"

Ack e Sed

Muitas vezes filtrar não é o suficiente, desejamos mudar o conteúdo das entradas que encontramos. Para isso podemos utilizar o ack em conjunto com o sed.

Para substituir todas as ocorrências de gandalf por saruman:

s1="gandalf"
ack -Rl $s1 module/ | xargs sed -i "s/$s1/saruman/g"

Geralmente uso uma variável bash para não ter que escrever a busca mais de uma vez.

Pretendo adicionar mais dicas aqui conforme vou crescendo em experiência com o ack. Certamente é uma ferramenta muito poderosa para aqueles que adotam o Unix Way.

  1. https://github.com/djanowski/ack-tutorial
  2. www.thelinuxdaily.com/2010/12/recursive-searchreplace-text-from-terminal