Ack este mai bun decât grep

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 este mai bun decât grep

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+"'

Ack este mai bun decât grep

Lista completă a tipurilor de fișiere acceptate poate fi consultată cu ajutorul:

ack --help-types

Adesea, 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.

Ack este mai bun decât grep
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

Ack este mai bun decât grep

Î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

Ack este mai bun decât grep

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/

Ack este mai bun decât grep

# 2 строки после 
ack --js --column -A 2 "query.once('" . /lib/

Ack este mai bun decât grep

Ș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+'

Ack este mai bun decât grep

Un exemplu mai complex

ack '*s+[vd+.d+.d+]'

Ack este mai bun decât grep

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+]'

Ack este mai bun decât grep

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 este mai bun decât grep

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

Ack este mai bun decât grep

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

Ack este mai bun decât grep

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.

Ack este mai bun decât grep

Lucrul cu fișierele

Obțineți lista fișierelor cu o anumită extensie

ack -f --js

Ack este mai bun decât grep

Căutați toate fișierele js ale căror nume încep cu P*, folosind opțiunea (-g).

ack -g --js '/Pa.+.js$'

Ack este mai bun decât grep

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=dist

Să adăugăm un tip de fișier personalizat —vue.

--type-add=vue:ext:js,vue

Acum 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 -y

Ubuntu

apt-get update -y && apt-get install ack-grep -y

Mac OS

brew update && brew install ack

Instalare de pe site

curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ack

Pluginuri 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 --man

Utilitarul 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

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster