Jag vill berätta om ett verktyg för sökning som förenklar livet avsevärt. När jag kommer till en server och behöver söka efter något, kollar jag först om ack är installerat. Det här verktyget är ett utmärkt alternativ till grep, och till viss del även find och wc. Varför inte grep? Ack har mer användarvänliga inställningar direkt, mer läsbara alternativ, Perl-reguljära uttryck och en konfigurationssystem. Om du gillar (eller måste) söka via terminalen, så bör du definitivt prova den.
Grundläggande funktioner
Ack är som standard rekursiv, och att skriva färre alternativ är alltid bra.
Vi kan använda flaggan -w, för att säga till verktyget att söka efter instanser av vårt mönster omgivna av ordgränser (blanksymboler, snedstreck, osv.).
ack -w mysql
Ack stödjer sökning efter filtyper. Till exempel, låt oss hitta versionen av modulen i json-filer.
ack --json '"version":s+"d+.d+.d+"'
En fullständig lista över stödda filtyper kan ses med:
ack --help-typesOfta behöver vi räkna hur många gånger en fras förekommer i en loggfil, till exempel för att förstå hur mycket data ett skript har bearbetat.
![]()
Vi räknar hur många gånger process förekommer i filen test.log, utan att ta hänsyn till versaler (-i).
Vi kan räkna förekomster inte bara i en specifik fil, utan i en grupp. Låt oss förbättra den tidigare sökningen av ordet mysql: vi räknar antalet förekomster av orden (-c) i *.js-filer (—js), utesluter filer där inget har hittats (-h) och summerar resultaten.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
Dessutom kan vi få en detaljerad rapport över antalet förekomster i varje fil med hjälp av (-l)
ack --js -w -cl mysql
Om du behöver mer sammanhang för sökningen kan du be ack
att visa rader före (-B) och efter (-A) det hittade uttrycket. För detta behöver du ange hur många rader som ska visas efter alternativet.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
Och om du behöver både och, använd (-C)
ack --js --column -C 2 "query.once('" . /lib/Det finns också ett alternativ (-v) för att invertera sökningen, dvs. visa rader där det angivna mönstret inte finns.
Reguljära uttryck
Ack använder till skillnad från grep Perl-kompatibla uttryck.
För mig är det en stor fördel, jag behöver inte memorera en separat syntaks för reguljära uttryck.
ack 'vars+adds+'
Ett mer komplext exempel
ack '*s+[vd+.d+.d+]'
Ofta vill man låta resultaten innehålla endast det som matchar mönstret. Här hjälper alternativet —output (-o)
ack -o '*s+[vd+.d+.d+]'
Dessutom kan vi med hjälp av parenteser markera den hittade delen och referera till den i resultatet via variabeln $[nummer grupp]. Till exempel,
ack --output='version är $1' '*s+[v(d+.d+.d+)]'
Ack har användbara alternativ —range-start och —range-end. De är till hjälp när
data lagras inte på en rad, utan i flera rader.
Till exempel, det finns en fil med SQL-kod

Vi kommer att hämta kolumnnamnen. Blockets början kommer att vara en rad som börjar med SELECT, och slutet kommer att vara en rad som börjar med FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' .\/test.sql
Om det finns specialtecken i sökfrågan som punkt, parentes och andra, kan man använda alternativet -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Arbete med filer
Hämta en lista över filer med ett specifikt filändelse
ack -f --js
Hitta alla js-filer vars namn börjar med P*, genom att använda alternativet (-g).
ack -g --js '\/Pa.+.js$'
Konfiguration
Verktyget har sin egen konfigurationsfil. Man kan ha både en global konfig för användaren (~\/ackrc), samt en lokal för en specifik mapp (det behövs skapa en fil .ackrc i mappen).
De flesta alternativ som anges i konfigurationerna kan också skrivas för hand vid anropet. Låt oss gå igenom några av dem.
Ignorera mappen vid sökningen
--ignore-dir=distLägg till en anpassad filtyp —vue.
--type-add=vue:ext:js,vueNu kan vi använda alternativet —vue för att söka i filerna .vue. Till exempel: ack —vue App.
Samtidigt kan man ange en lista med filändelser för detta alternativ. Till exempel, här vid användning av —vue kommer även .js-filer att hanteras.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:\/\.min.js$\/Installation
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstallation från webbplatsen
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackPlugins för textredigerare:
Slutsats
Detta är långt ifrån alla funktioner. En fullständig lista över funktioner kan ses genom att köra:
ack --help
# eller
ack --manVerktyget ack gör det enklare och mer flexibelt att söka i terminalen. Och med hjälp av pipeline (ack -C 10 hello | ack world) kan man skapa en kraftfull maskin för att söka och filtrera data i filsystemet och i filerna själva.
Källa: habr.com
