Voglio parlarti di un'utilità per la ricerca che semplifica notevolmente la vita. Quando accedo a un server e devo cercare qualcosa, controllo innanzitutto se è installato ack. Questa utilità è un'ottima alternativa a grep, e in qualche modo anche a find e wc. Perché non grep? Ack ha impostazioni più piacevoli di default, opzioni più leggibili, regex perl e un sistema di configurazione. Se ti piace (o devi) cercare tramite terminale, dovresti sicuramente provarlo.
Funzionalità di base
Ack è ricorsivo di default, e scrivere meno opzioni è sempre una buona cosa.
Possiamo utilizzare il flag -w, per dire all'utilità di cercare un'istanza del nostro modello circondata da confini di parole (spazi bianchi, barra, ecc.).
ack -w mysql
Ack supporta la ricerca per tipo di file. Ad esempio, troviamo la versione del modulo nei file json.
ack --json '"version":s+"d+.d+.d+"'
Puoi vedere l'elenco completo dei tipi di file supportati usando:
ack --help-typesSpesso è necessario contare quante volte una frase appare in un file di log, ad esempio per capire quanto dati ha elaborato uno script.
![]()
Contiamo quante volte process appare nel file test.log, ignorando il case ("-i).
Possiamo contare le occorrenze non solo in un singolo file, ma in un gruppo. Miglioriamo la ricerca precedente della parola mysql: contiamo il numero di occorrenze della parola (-c) nei file *.js (—js), escludendo i file in cui non è stata trovata alcuna corrispondenza (-h) e sommando il totale.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
Inoltre, possiamo ottenere un report dettagliato sul numero di occorrenze in ogni file utilizzando (-l)
ack --js -w -cl mysql
Se hai bisogno di ulteriore contesto per la ricerca, puoi chiedere a ack
di mostrare le righe precedenti (-B) e successive (-A) all'espressione trovata. Per farlo, devi specificare, dopo l'opzione, il numero di righe che desideri visualizzare.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
E se hai bisogno di entrambe le cose, usa (-C)
ack --js --column -C 2 "query.once('" ./lib/Esiste anche l'opzione (-v) per invertire la ricerca, ovvero mostrare le righe in cui non c'è un determinato modello.
Espressione regolare
Ack, a differenza di grep, utilizza espressioni compatibili con Perl.
Per me questo è un grande vantaggio, non devo ricordare una sintassi separata per le regex.
ack 'vars+adds+'
Esempio più complesso
ack '*s+[vd+.d+.d+]'
Spesso si desidera lasciare nei risultati solo ciò che corrisponde al modello. Qui aiuta l'opzione —output (-o)
ack -o '*s+[vd+.d+.d+]'
Inoltre, utilizzando le parentesi tonde possiamo evidenziare la parte trovata e riferirci ad essa nell'output tramite la variabile $[numero del gruppo]. Ad esempio,
ack --output='version is $1' '*s+[v(d+.d+.d+)]'
Ack ha opzioni utili —range-start e —range-end. Queste sono utili quando
i dati non sono memorizzati su una singola riga, ma in formato multilinea.
Ad esempio, c'è un file con codice sql

Estraiamo i nomi delle colonne. L'inizio del blocco sarà una riga che inizia con SELECT, mentre la fine sarà una riga che inizia con FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
Se nell'espressione di ricerca sono presenti simboli speciali come il punto, la parentesi tonde e altri, per non doverli escludere con \, è possibile utilizzare l'opzione -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Lavorare con i file
Ottenere un elenco di file con un'estensione specifica
ack -f --js
Trovare tutti i file js il cui nome inizia con P*, utilizzando l'opzione (-g).
ack -g --js '/Pa.+.js$'
Configurazione
L'utilità ha un file di configurazione. Si può avere sia una configurazione globale per l'utente (~/.ackrc) che una locale per una specifica cartella (nella cartella è necessario creare un file .ackrc).
La maggior parte delle opzioni che si possono impostare nei file di configurazione possono essere anche scritte manualmente durante la chiamata. Analizziamo alcune di esse.
Ignorare la cartella durante la ricerca
--ignore-dir=distAggiungiamo un tipo di file personalizzato —vue.
--type-add=vue:ext:js,vueOra puoi utilizzare l'opzione —vue per cercare nei file .vue. Ad esempio: ack —vue App.
In questo modo puoi specificare un elenco di estensioni per quest'opzione. Ad esempio, qui usando —vue verranno elaborati anche .js file.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:/.min.js$/Installazione
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstallazione dal sito
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackPlugin per editor:
Conclusione
Queste non sono affatto tutte le funzionalità. Puoi vedere l'elenco completo delle funzioni eseguendo:
ack –-help
# o
ack --manL'utilità ack rende la ricerca nel terminale più comoda e flessibile. E con la pipeline (ack -C 10 hello | ack world) puoi creare un potente strumento per cercare e filtrare dati nel file system e all'interno dei file.
Fonte: habr.com
