Ack är bättre än grep

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 är bättre än grep

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

Ack är bättre än grep

En fullständig lista över stödda filtyper kan ses med:

ack --help-types

Ofta 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.

Ack är bättre än grep
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

Ack är bättre än grep

Dessutom kan vi få en detaljerad rapport över antalet förekomster i varje fil med hjälp av (-l)

ack --js -w -cl mysql

Ack är bättre än grep

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/

Ack är bättre än grep

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

Ack är bättre än grep

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

Ack är bättre än grep

Ett mer komplext exempel

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

Ack är bättre än grep

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

Ack är bättre än grep

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 är bättre än grep

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

Ack är bättre än grep

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

Ack är bättre än grep

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.

Ack är bättre än grep

Arbete med filer

Hämta en lista över filer med ett specifikt filändelse

ack -f --js

Ack är bättre än grep

Hitta alla js-filer vars namn börjar med P*, genom att använda alternativet (-g).

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

Ack är bättre än grep

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

Lägg till en anpassad filtyp —vue.

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

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

Ubuntu

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

Mac OS

brew update && brew install ack

Installation från webbplatsen

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

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

Verktyget 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

Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster