Ack is beter dan grep

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 is beter dan grep

Ack ondersteunt zoeken op bestandstype. Bijvoorbeeld, laten we de versie van de module in json-bestanden vinden.

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

Ack is beter dan grep

De volledige lijst van ondersteunde bestandstypen kun je bekijken met:

ack --help-types

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

Ack is beter dan grep
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

Ack is beter dan grep

Bovendien kunnen we een gedetailleerd rapport krijgen over het aantal vermeldingen in elk bestand met behulp van (-l)

ack --js -w -cl mysql

Ack is beter dan grep

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/

Ack is beter dan grep

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

Ack is beter dan grep

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

Ack is beter dan grep

Complexer voorbeeld

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

Ack is beter dan grep

Vaak wil je alleen de resultaten die overeenkomen met het sjabloon behouden. Hier helpt de optie —output (-o)

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

Ack is beter dan grep

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 is beter dan grep

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

Ack is beter dan grep

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

Ack is beter dan grep

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.

Ack is beter dan grep

Werken met bestanden

Krijg een lijst van bestanden met een bepaalde extensie

ack -f --js

Ack is beter dan grep

Zoek alle js-bestanden waarvan de naam begint met P*, gebruikmakend van de optie (-g).

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

Ack is beter dan grep

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

Laten we een aangepaste bestands type toevoegen —vue.

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

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

Ubuntu

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

Mac OS

brew update && brew install ack

Installatie vanaf de website

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

Plugins voor editors:

Conclusie

Dit is lang niet alles wat mogelijk is. Een volledige lijst van functies is te bekijken door:

ack --help
# of
ack --man

De 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

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster