Vreau să vorbesc despre o utilitară de căutare care îți simplifică semnificativ viața. Când ajung pe un server și trebuie să caut ceva, primul lucru pe care îl fac este să verific dacă ack este instalat. Această utilitară este o excelentă alternativă la grep, dar, într-o oarecare măsură, și la find și wc. De ce nu grep? Ack are setări mai plăcute din fabrică, opțiuni mai ușor de citit pentru oameni, expresii regulate Perl și un sistem de configurări. Dacă îți place (sau ești nevoit să) să cauți prin terminal, atunci cu siguranță ar trebui să o încerci.
Funcționalități de bază
Ack este recursiv în mod implicit, iar a scrie mai puține opțiuni este întotdeauna bine.
Putem folosi flagra -w, pentru a spune utilitarului să caute instanța șablonului nostru, înconjurată de limitele cuvintelor (caractere de spațiu, slash etc.).
ack -w mysql
Ack suportă căutarea după tipul de fișiere. De exemplu, să găsim versiunea modulului în fișiere json.
ack --json '"version":s+"d+.d+.d+"'
Lista completă a tipurilor de fișiere acceptate poate fi consultată cu ajutorul:
ack --help-typesAdesea, trebuie să numărăm de câte ori apare o frază într-un fișier de jurnal, de exemplu, pentru a înțelege cât de multe date a procesat scriptul.
![]()
Numărăm de câte ori apare process în fișierul test.log, fără a ține cont de majuscule (-i).
Putem număra aparițiile nu doar într-un singur fișier specific, ci într-un grup. Vom îmbunătăți căutarea anterioară a cuvântului mysql: să numărăm numărul de apariții ale cuvintelor (-s) în fișierele *.js (—js), excludând fișierele în care nu s-a găsit nimic (-h) și suma finală.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
În plus, putem obține un raport detaliat despre numărul de apariții în fiecare fișier cu ajutorul (-l)
ack --js -w -cl mysql
Dacă ai nevoie de context suplimentar pentru căutare, poți cere lui ack
să arate liniile de dinainte (-B) și de după (-A) expresiei găsite. Pentru aceasta, trebuie să specifici, după opțiune, numărul de linii pe care vrei să le vezi.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
Și dacă ai nevoie de ambele, folosește (-C)
ack --js --column -C 2 "query.once('" .\/lib\/Există, de asemenea, o opțiune (-v) pentru inversarea căutării, adică pentru a arăta liniile în care nu există șablonul specificat.
Expresia regulată
Ack, spre deosebire de grep, folosește expresii compatibile Perl.
Pentru mine, aceasta este un mare avantaj, nu trebuie să memorez o sintaxă separată pentru expresiile regulate.
ack 'vars+adds+'
Un exemplu mai complex
ack '*s+[vd+.d+.d+]'
Adesea, vrei să lași în rezultate doar ceea ce se potrivește cu șablonul. Aici te va ajuta opțiunea —output (-o)
ack -o '*s+[vd+.d+.d+]'
Pe lângă toate, folosind parantezele rotunde, putem evidenția partea găsită și ne putem referi la ea în output prin intermediul variabilei $[număr grup]. De exemplu,
ack --output='versiunea este $1' '*s+[v(d+.d+.d+)]'
Ack are opțiuni utile —range-start și —range-end. Acestea ajută atunci când
datele nu sunt stocate pe o singură linie, ci sub formă multiline.
De exemplu, există un fișier cu cod SQL

Vom extrage numele coloanelor. Începutul blocului va fi o linie care începe cu SELECT, iar sfârșitul va fi o linie care începe cu FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
Dacă expresia de căutare conține caractere speciale precum punctul, paranteza rotundă și altele, pentru a nu le scăpa, se poate folosi opțiunea -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Lucrul cu fișierele
Obțineți lista fișierelor cu o anumită extensie
ack -f --js
Căutați toate fișierele js ale căror nume încep cu P*, folosind opțiunea (-g).
ack -g --js '/Pa.+.js$'
Configurație
Utilitarul are propriul fișier de configurare. Poate avea atât un config global pentru utilizator (~/.ackrc), cât și unul local pentru un folder specific (în folder trebuie să creați fișierul .ackrc).
Cele mai multe opțiuni care sunt specificate în configurări pot fi scrise manual la apelare. Să analizăm câteva dintre ele.
Ignorarea unui folder la căutare
--ignore-dir=distSă adăugăm un tip de fișier personalizat —vue.
--type-add=vue:ext:js,vueAcum se poate folosi opțiunea —vue, pentru a căuta în fișiere .vue. De exemplu: ack —vue App.
De asemenea, se poate specifica o listă de extensii pentru această opțiune. De exemplu, aici, folosind —vue, vor fi procesate și .js fișiere.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:/.min.js$/Instalare
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstalare de pe site
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackPluginuri pentru editori:
Concluzie
Acesta nu este tot arsenalul de funcționalități. O listă completă a funcțiilor poate fi vizualizată rulând:
ack --help
# sau
ack --manUtilitarul ack face căutarea în terminal mai comodă și flexibilă. Iar cu ajutorul pipeline (ack -C 10 hello | ack world) se poate crea un puternic combinator pentru căutarea și filtrarea datelor în sistemul de fișiere și în fișierele în sine.
Sursa: habr.com
