Ack is beter dan grep

Ik wil je vertellen over één zoekhulpprogramma dat het leven enorm vereenvoudigt. Als ik bij de server kom en ik moet naar iets zoeken, controleer dan eerst of ack is geïnstalleerd. Dit hulpprogramma is tot op zekere hoogte een uitstekende vervanging voor grep, en ook voor find en wc. Waarom niet grep? Ack heeft mooiere standaardinstellingen, meer door mensen leesbare opties, perl regex en een configuratiesysteem. Als je het leuk vindt (moet) zoeken in de terminal, dan moet je het zeker eens proberen.

Basis kenmerken

Ack is standaard recursief en het schrijven van minder opties is altijd een goed idee.

We kunnen een vlag gebruiken -wom het hulpprogramma te vertellen dat het moet zoeken naar een exemplaar van ons patroon omgeven door woordgrenzen (witruimte, schuine strepen, enz.).

ack -w mysql

Ack is beter dan grep

Ack ondersteunt zoeken op bestandstype. Laten we bijvoorbeeld de moduleversie in json-bestanden zoeken.

ack --json '"version":s+"d+.d+.d+"'

Ack is beter dan grep

Een volledige lijst met ondersteunde bestandstypen kan worden bekeken met behulp van:

ack --help-types

Vaak moet u tellen hoe vaak een zin in een logbestand voorkomt, om bijvoorbeeld te begrijpen hoeveel gegevens het script heeft verwerkt.

Ack is beter dan grep
We tellen hoe vaak het proces plaatsvindt in het test.log-bestand, zonder rekening te houden met case (-i).

We kunnen gebeurtenissen niet alleen in één specifiek bestand tellen, maar ook in een groep. Laten we de vorige zoekopdracht naar het woord mysql afronden: tel het aantal keren dat woorden voorkomen (-van) in *.js-bestanden(--js), met uitzondering van bestanden waarin niets is gevonden (-h) en het resultaat samenvatten.

# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql

Ack is beter dan grep

Bovendien kunnen we een gedetailleerd rapport krijgen over het aantal keren dat elk bestand voorkomt met behulp van (-l)

ack --js -w -cl mysql

Ack is beter dan grep

Als u extra context nodig heeft voor uw zoekopdracht, kunt u ar vragen
toon regels tot (-B) en daarna (-A) van de gevonden uitdrukking. Om dit te doen, moet u achter de optie het aantal regels opgeven dat moet worden weergegeven.

# 2 строки до 
ack --js --column -B 2 "query.once('" ./lib/

Ack is beter dan grep

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

Ack is beter dan grep

En als je beide nodig hebt, gebruik dan (-C)

ack --js --column -C 2 "query.once('" ./lib/

Er is ook een optie (-v) om de zoekopdracht om te keren, d.w.z. lijnen tonen die geen bepaald patroon bevatten.

Reguliere expressie

Ack gebruikt, in tegenstelling tot grep, Perl-compatibele expressies.
Voor mij is dit een groot pluspunt; ik hoef geen aparte syntaxis voor reguliere expressies te onthouden.

ack 'vars+adds+'

Ack is beter dan grep

Complexer voorbeeld

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

Ack is beter dan grep

Vaak wilt u alleen in de resultaten laten staan ​​wat overeenkomt met de sjabloon. De --output optie zal hier helpen (-o)

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

Ack is beter dan grep

Bovendien kunnen we met behulp van haakjes het gevonden onderdeel selecteren en er toegang toe krijgen in de uitvoer via de variabele $[groepsnummer]. Bijvoorbeeld,

ack --output='version is $1' '*s+[v(d+.d+.d+)]'

Ack is beter dan grep

Ack heeft handige opties --bereik-start и --bereik-einde. Ze helpen wanneer
De gegevens worden niet op één regel, maar in meerregelige vorm opgeslagen.

Er is bijvoorbeeld een bestand met sql-code

Ack is beter dan grep

Laten we de kolomnamen extraheren. Het begin van het blok is een regel die begint met SELECT, en het einde is een regel die begint met FROM.

ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql

Ack is beter dan grep

Als de zoekuitdrukking speciale tekens bevat, zoals een punt, een haakje en andere, kunt u de optie gebruiken om ze niet te omzeilen met behulp van . -Q.

# Поиск с экранированием 
ack --json 'mysql.'    
# Поиск без экранирования
ack --json -Q mysql.

Ack is beter dan grep

Werken met bestanden

Ontvang een lijst met bestanden met een specifieke extensie

ack -f --js

Ack is beter dan grep

Vind alle js-bestanden waarvan de naam begint met P* met behulp van de optie (-g).

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

Ack is beter dan grep

Configuratie

Het hulpprogramma heeft een eigen configuratiebestand. U kunt zowel een globale configuratie voor de gebruiker (~/.ackrc) als een lokale configuratie voor een specifieke map hebben (u moet een .ackrc-bestand in de map maken).

De meeste opties die in de configuraties zijn geschreven, kunnen handmatig worden opgegeven wanneer ze worden aangeroepen. Laten we er een paar bekijken.

Negeer de map tijdens het zoeken

--ignore-dir=dist

Laten we een aangepast bestandstype -vue toevoegen.

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

Nu kunt u de optie --vue gebruiken om bestanden te zoeken .vue. Bijvoorbeeld: ack --vue-app.
U kunt voor deze optie een lijst met extensies opgeven. Als u hier bijvoorbeeld -vue gebruikt, wordt het volgende verwerkt:
.js-bestanden.

Negeer bestanden, bijvoorbeeld verkleinde *.min.js

--ignore-file=match:/.min.js$/

installatie

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

Installatie vanaf de locatie

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

Plug-ins voor editors:

Conclusie

Dit zijn niet alle mogelijkheden. De volledige lijst met functies kan worden bekeken door het volgende uit te voeren:

ack –-help
# или
ack --man

Met het ack-hulpprogramma kunt u het zoeken in de terminal handiger en flexibeler maken. En met behulp van pijplijn (ack -C 10 hallo | aak wereld) kunt u een krachtige combinatie maken voor het zoeken en filteren van gegevens in het bestandssysteem en in de bestanden zelf.

Bron: www.habr.com

Voeg een reactie