Quero falar sobre um utilitário de pesquisa que simplifica muito a vida. Quando chego ao servidor e preciso procurar alguma coisa, a primeira coisa que faço é verificar se o ack está instalado. Este utilitário é um excelente substituto para grep, bem como find e wc até certo ponto. Por que não grep? Ack tem configurações melhores prontas para uso, opções mais legíveis, perl regex e um sistema de configuração. Se você gosta (precisa) pesquisar no terminal, então você definitivamente deveria tentar.
Recursos básicos
Ack é recursivo por padrão e escrever menos opções é sempre uma boa ideia.
Podemos usar uma bandeira -wpara dizer ao utilitário para procurar uma instância de nosso padrão cercada por limites de palavras (espaços em branco, barras, etc.).
ack -w mysql
Ack suporta pesquisa por tipo de arquivo. Por exemplo, vamos encontrar a versão do módulo em arquivos json.
ack --json '"version":s+"d+.d+.d+"'
Uma lista completa dos tipos de arquivos suportados pode ser visualizada usando:
ack --help-types
Muitas vezes você precisa contar quantas vezes uma frase aparece em um arquivo de log, por exemplo, para entender quantos dados o script processou.
Contamos quantas vezes o processo ocorre no arquivo test.log, sem levar em consideração o caso (-i).
Podemos contar ocorrências não apenas em um arquivo específico, mas em um grupo. Vamos finalizar a busca anterior pela palavra mysql: conte o número de ocorrências das palavras (com) em arquivos *.js (--js), excluindo arquivos nos quais nada foi encontrado (-h) e resumindo o resultado.
# выведем на экран все вхождения
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 (-l)
ack --js -w -cl mysql
Se precisar de contexto adicional para sua pesquisa, você pode perguntar
mostrar linhas até (-B) e depois (-A) da expressão encontrada. Para fazer isso, você precisa especificar após a opção o número de linhas que precisam ser mostradas.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
E se você precisar de ambos, use (-A PARTIR DE)
ack --js --column -C 2 "query.once('" ./lib/
Também existe uma opção (-v) para inverter a pesquisa, ou seja, mostrar linhas que não contêm um determinado padrão.
Expressão regular
Ack, diferentemente do grep, usa expressões compatíveis com Perl.
Para mim isso é uma grande vantagem; não preciso me lembrar de uma sintaxe separada para expressões regulares.
ack 'vars+adds+'
Exemplo mais complexo
ack '*s+[vd+.d+.d+]'
Muitas vezes você deseja deixar nos resultados apenas o que corresponde ao modelo. A opção --output ajudará aqui (-o)
ack -o '*s+[vd+.d+.d+]'
Além disso, usando parênteses podemos selecionar a parte encontrada e acessá-la na saída através da variável $[group number]. Por exemplo,
ack --output='version is $1' '*s+[v(d+.d+.d+)]'
Ack tem opções úteis --range-start и --range-end. Eles ajudam quando
Os dados são armazenados não em uma linha, mas em formato multilinha.
Por exemplo, existe um arquivo com código sql
Vamos extrair os nomes das colunas. O início do bloco será uma linha começando com SELECT e o final será uma linha começando com FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
Se a expressão de pesquisa contiver caracteres especiais, como ponto final, parêntese e outros, para não escapar deles usando , você pode usar a opção -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Trabalhando com arquivos
Obtenha uma lista de arquivos com uma extensão específica
ack -f --js
Encontre todos os arquivos js cujo nome começa com P* usando a opção (-g).
ack -g --js '/Pa.+.js$'
Configuração
O utilitário possui seu próprio arquivo de configuração. Você pode ter uma configuração global para o usuário (~/.ackrc) e uma local para uma pasta específica (você precisa criar um arquivo .ackrc na pasta).
A maioria das opções escritas nas configurações podem ser especificadas manualmente quando chamadas. Vejamos alguns deles.
Ignorar pasta ao pesquisar
--ignore-dir=dist
Vamos adicionar um tipo de arquivo personalizado -vue.
--type-add=vue:ext:js,vue
Agora você pode usar a opção --vue para pesquisar arquivos .vue. Por exemplo: ack --vue Aplicativo.
Você pode especificar uma lista de extensões para esta opção. Por exemplo, aqui, ao usar -vue, o seguinte será processado: Arquivos .js.
Ignore arquivos, por exemplo *.min.js minificados
--ignore-file=match:/.min.js$/
Instalação
CentOS
yum update -y && yum install ack -y
Ubuntu
apt-get update -y && apt-get install ack-grep -y
Mac OS
brew update && brew install ack
Instalação do site
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ack
Plug-ins para editores:
Conclusão
Estas não são todas as possibilidades. A lista completa de funções pode ser visualizada executando:
ack –-help
# или
ack --man
O utilitário ack permite tornar a pesquisa no terminal mais conveniente e flexível. E usando pipeline (ack -C 10 olá | ack mundo) você pode criar uma combinação poderosa para pesquisar e filtrar dados no sistema de arquivos e nos próprios arquivos.
Fonte: habr.com