Quero falar sobre uma ferramenta de busca que facilita muito a vida. Quando eu acesso um servidor e preciso procurar algo, a primeira coisa que faço é verificar se o ack está instalado. Esta ferramenta é uma excelente alternativa ao grep, bem como em certa medida ao find e wc. Por que não usar o grep? O Ack tem configurações mais agradáveis desde o início, opções mais legíveis, expressões regulares Perl e um sistema de configurações. Se você gosta (ou precisa) de buscar através do terminal, definitivamente vale a pena experimentá-la.
Funcionalidades Básicas
O Ack é recursivo por padrão, e escrever menos opções é sempre uma boa ideia.
Podemos usar a flag -w, para dizer à ferramenta para buscar a ocorrência do nosso padrão, cercado por limites de palavras (espaços, barras etc.).
ack -w mysql
O Ack suporta buscas por tipo de arquivo. Por exemplo, vamos encontrar a versão do módulo em arquivos json.
ack --json '"version":s+"d+.d+.d+"'
A lista completa de tipos de arquivos suportados pode ser vista com:
ack --help-typesFreqüentemente, precisamos contar quantas vezes uma frase aparece em um arquivo de log, por exemplo, para entender quanta informação um script processou.
![]()
Contamos quantas vezes a palavra process aparece no arquivo test.log, ignorando maiúsculas (-i).
Podemos contar as ocorrências não apenas em um arquivo específico, mas em um grupo. Aperfeiçoamos a busca anterior pela palavra mysql: vamos contar o número de ocorrências da palavra (-c) em arquivos *.js (—js), excluindo arquivos em que nada foi encontrado (-h) e somando o total.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
Além disso, podemos obter um relatório detalhado sobre o número de ocorrências em cada arquivo usando (--selector)
ack --js -w -cl mysql
Se você precisar de contexto adicional para a busca, pode pedir ao ack
para mostrar linhas antes (-B) e depois (-A) da expressão encontrada. Para isso, é necessário especificar após a opção o número de linhas que devem ser exibidas.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
E se precisar de ambas as coisas, então use (-C)
ack --js --column -C 2 "query.once('" .\/lib\/Há também a opção (-v) para inverter a busca, ou seja, mostrar linhas que não contêm o padrão especificado.
Expressões Regulares
O Ack, ao contrário do grep, usa expressões compatíveis com Perl.
Para mim, isso é uma grande vantagem, não precisa decorar uma sintaxe separada para expressões regulares.
ack 'vars+adds+'
Um exemplo mais complexo
ack '*s+[vd+.d+.d+]'
Freqüentemente, queremos deixar apenas o que corresponde ao padrão nos resultados. Aqui a opção —output ajuda (-o)
ack -o '*s+[vd+.d+.d+]'
Além disso, com os parênteses, podemos destacar a parte encontrada e referi-la no output através da variável $[número do grupo]. Por exemplo,
ack --output='versão é $1' '*s+[v(d+.d+.d+)]'
Ack possui opções úteis —range-start e —range-end. Elas ajudam quando
os dados não estão armazenados em uma única linha, mas em formato multilinha.
Por exemplo, há um arquivo com código sql

Extrairemos os nomes das colunas. O início do bloco será uma linha que começa com SELECT, e o fim será uma linha que começa com FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' .\/test.sql
Se na expressão de pesquisa estão envolvidos caracteres especiais como ponto, parêntese e outros, para não precisar escapar com , podemos usar a opção -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Trabalhando com arquivos
Obter uma lista de arquivos com uma extensão específica
ack -f --js
Encontrar todos os arquivos js cujo nome começa com P*, utilizando a opção(-g).
ack -g --js '\/Pa.+.js$'
Configuração
A ferramenta possui seu próprio arquivo de configuração. Pode-se ter uma configuração global para o usuário (~\/ .ackrc), assim como uma local para uma pasta específica (nesta pasta é necessário criar o arquivo .ackrc).
A maioria das opções que são especificadas nas configurações também podem ser definidas manualmente ao chamar. Vamos analisar algumas delas.
Ignorar a pasta durante a busca
--ignore-dir=distVamos adicionar um tipo de arquivo personalizado —vue.
--type-add=vue:ext:js,vueAgora é possível usar a opção —vue para procurar em arquivos .vue. Por exemplo: ack —vue App.
Nesse caso, podemos especificar uma lista de extensões para esta opção. Por exemplo, aqui ao usar —vue, também serão processados .js arquivos.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:\/ .min.js$\/Instalação
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstalação a partir do site
curl https:\/\/beyondgrep.com\/ack-v3.3.1 > ~\/bin\/ack && chmod 0755 ~\/bin\/ackPlugins para editores:
Conclusão
Isso está longe de ser todas as funcionalidades. A lista completa de funções pode ser vista executando:
ack –-help
# ou
ack --manA ferramenta ack torna a pesquisa no terminal mais conveniente e flexível. E com o pipeline (ack -C 10 hello | ack world) é possível criar uma poderosa combinação para pesquisa e filtragem de dados no sistema de arquivos e nos próprios arquivos.
Fonte: habr.com
