Ik wil het hebben over een hulpprogramma voor zoeken dat het leven enorm vereenvoudigt. Wanneer ik op een server kom en ik moet iets zoeken, is de eerste stap om te controleren of ack geïnstalleerd is. Dit hulpprogramma is een uitstekende vervanging voor grep, en in zekere zin ook voor find en wc. Waarom niet grep? Ack heeft standaard meer gebruiksvriendelijke instellingen, meer leesbare opties, Perl-reguliere expressies en een configuratiesysteem. Als je graag (of moet) zoeken via de terminal, dan moet je het zeker proberen.
Basis Functionaliteiten
Ack is standaard recursief, en minder opties hoeven altijd goed te zijn.
We kunnen de vlag gebruiken -w, om het hulpprogramma te vertellen een instantie van ons sjabloon te zoeken, omringd door woordgrenzen (spaties, een schuine streep, enzovoorts).
ack -w mysql
Ack ondersteunt zoeken op bestandstype. Bijvoorbeeld, laten we de versie van de module in json-bestanden vinden.
ack --json '"version":s+"d+.d+.d+"'
De volledige lijst van ondersteunde bestandstypen kun je bekijken met:
ack --help-typesVaak moet je tellen hoe vaak een zin voorkomt in een logbestand, bijvoorbeeld om te begrijpen hoeveel gegevens het script heeft verwerkt.
![]()
Laten we tellen hoe vaak process voorkomt in het bestand test.log, zonder hoofdlettergevoeligheid (-i).
We kunnen de vermeldingen niet alleen in één specifiek bestand tellen, maar ook in een groep. Laten we de vorige zoekopdracht voor het woord mysql uitbreiden: we tellen het aantal vermeldingen van woorden (-s) in *.js-bestanden (—js), waarbij we bestanden uitsluiten waarin niets is gevonden (-h) en de totalen optellen.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
Bovendien kunnen we een gedetailleerd rapport krijgen over het aantal vermeldingen in elk bestand met behulp van (-l)
ack --js -w -cl mysql
Als je aanvullende context voor het zoeken nodig hebt, kun je ack vragen
om de regels voor (-B) en na (-A) de gevonden uitdrukking weer te geven. Hiervoor moet je na de optie het aantal regels opgeven dat je wilt laten zien.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
Als je zowel het één als het ander nodig hebt, gebruik dan (-C)
ack --js --column -C 2 "query.once('" . /lib/Er is ook de optie (-v) voor het omkeren van het zoeken, d.w.z. het tonen van de regels waarin geen bepaald sjabloon voorkomt.
Reguliere Expressies
Ack gebruikt in tegenstelling tot grep Perl-compatibele expressies.
Voor mij is dit een groot pluspunt, omdat ik geen aparte syntaxis voor reguliere expressies hoef te onthouden.
ack 'vars+adds+'
Complexer voorbeeld
ack '*s+[vd+.d+.d+]'
Vaak wil je alleen de resultaten die overeenkomen met het sjabloon behouden. Hier helpt de optie —output (-o)
ack -o '*s+[vd+.d+.d+]'
Bovendien kunnen we met behulp van ronde haakjes het gevonden gedeelte markeren en er in de uitvoer naar verwijzen via de variabele $[nummer groep]. Bijvoorbeeld,
ack --output='versie is $1' '*s+[v(d+.d+.d+)]'
Ack heeft nuttige opties —range-start en —range-end. Ze helpen wanneer
data niet in één regel zijn opgeslagen, maar in meerdere regels.
Bijvoorbeeld, er is een bestand met sql-code

Laten we de kolomnamen extraheren. Het begin van het blok zal een regel zijn die begint met SELECT, en het einde zal een regel zijn die begint met FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
Als er speciale symbolen zoals een punt, ronde haakjes en anderen in de zoekopdracht worden gebruikt, dan kun je de optie gebruiken om ze niet te hoeven escapen -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Werken met bestanden
Krijg een lijst van bestanden met een bepaalde extensie
ack -f --js
Zoek alle js-bestanden waarvan de naam begint met P*, gebruikmakend van de optie (-g).
ack -g --js '/Pa.+.js$'
Configuratie
De utility heeft een configuratiebestand. Je kunt zowel een globale configuratie voor de gebruiker (~/.ackrc) hebben als een lokale voor een specifieke map (in de map moet het bestand .ackrc worden aangemaakt).
De meeste opties die in de configuraties worden vermeld, kunnen ook handmatig worden gespecificeerd bij de aanroep. Laten we er een paar bekijken.
Negeer de map tijdens het zoeken
--ignore-dir=distLaten we een aangepaste bestands type toevoegen —vue.
--type-add=vue:ext:js,vueNu kun je de optie —vue gebruiken om in de bestanden .vue te zoeken. Bijvoorbeeld: ack —vue App.
Je kunt ook een lijst van extensies voor deze optie opgeven. Bijvoorbeeld, met —vue zullen ook .js-bestanden worden verwerkt.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:/\.min.js$/Installatie
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstallatie vanaf de website
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackPlugins voor editors:
Conclusie
Dit is lang niet alles wat mogelijk is. Een volledige lijst van functies is te bekijken door:
ack --help
# of
ack --manDe utility ack maakt het zoeken in de terminal handiger en flexibeler. En met behulp van een pipeline (ack -C 10 hello | ack world) kun je een krachtige machine maken voor het zoeken en filteren van gegevens in het bestandssysteem en in de bestanden zelf.
Bron: habr.com
