Ack è meglio di grep

Voglio parlarti di un'utilità di ricerca che semplifica notevolmente la vita. Quando arrivo al server e ho bisogno di cercare qualcosa, la prima cosa che faccio è controllare se ack è installato. Questa utility è un eccellente sostituto di grep, nonché di find e wc in una certa misura. Perché non grep? Ack ha impostazioni più belle e pronte all'uso, opzioni più leggibili dall'uomo, perl regex e un sistema di configurazione. Se ti piace (devi) cercare attraverso il terminale, allora dovresti assolutamente provarlo.

Caratteristiche di base

Ack è ricorsivo per impostazione predefinita e scrivere meno opzioni è sempre una buona idea.

Possiamo usare una bandiera -wper dire all'utilità di cercare un'istanza del nostro modello circondata da confini di parole (spazi bianchi, barre, ecc.).

ack -w mysql

Ack è meglio di grep

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

Ack è meglio di grep

È possibile visualizzare un elenco completo dei tipi di file supportati utilizzando:

ack --help-types

Spesso è necessario contare quante volte una frase appare in un file di registro, ad esempio, per capire quanti dati ha elaborato lo script.

Ack è meglio di grep
Contiamo quante volte il processo si verifica nel file test.log, senza tenere conto del caso (-i).

Possiamo contare le occorrenze non solo in un file specifico, ma in un gruppo. Concludiamo la ricerca precedente per la parola mysql: contiamo il numero di occorrenze delle parole (-Con) nei file *.js(--js), esclusi i file in cui non è stato trovato nulla (-h) e riassumendo il risultato.

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

Ack è meglio di grep

Inoltre, possiamo ottenere un rapporto dettagliato sul numero di occorrenze in ciascun file utilizzando (-l)

ack --js -w -cl mysql

Ack è meglio di grep

Se hai bisogno di ulteriore contesto per la tua ricerca, puoi chiedere ack
mostra le righe fino a (-B) e dopo (-A) dell'espressione trovata. Per fare ciò, è necessario specificare dopo l'opzione il numero di righe che devono essere mostrate.

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

Ack è meglio di grep

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

Ack è meglio di grep

E se hai bisogno di entrambi, usa (-INSIEME A)

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

C'è anche un'opzione (-v) per invertire la ricerca, ovvero mostrare le righe che non contengono un determinato pattern.

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 espressioni regolari.

ack 'vars+adds+'

Ack è meglio di grep

Esempio più complesso

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

Ack è meglio di grep

Spesso si desidera lasciare nei risultati solo ciò che corrisponde al modello. L'opzione --output aiuterà qui (-o)

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

Ack è meglio di grep

Inoltre, utilizzando le parentesi possiamo selezionare la parte trovata e accedervi in ​​output tramite la variabile $[numero gruppo]. Per esempio,

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

Ack è meglio di grep

Ack ha opzioni utili --intervallo-inizio и --fine-intervallo. Aiutano quando
I dati non vengono memorizzati su una riga, ma su più righe.

Ad esempio, c'è un file con codice SQL

Ack è meglio di grep

Estraiamo i nomi delle colonne. L'inizio del blocco sarà una linea che inizia con SELECT e la fine sarà una linea che inizia con FROM.

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

Ack è meglio di grep

Se l'espressione di ricerca contiene caratteri speciali come un punto, una parentesi e altri, per non evitarne l'escape utilizzando , puoi utilizzare l'opzione -Q.

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

Ack è meglio di grep

Lavorare con i file

Ottieni un elenco di file con un'estensione specifica

ack -f --js

Ack è meglio di grep

Trova tutti i file js il cui nome inizia con P* utilizzando l'opzione (-g).

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

Ack è meglio di grep

Configurazione

L'utilità ha il proprio file di configurazione. Puoi avere sia una configurazione globale per l'utente (~/.ackrc) che una locale per una cartella specifica (devi creare un file .ackrc nella cartella).

La maggior parte delle opzioni scritte nelle configurazioni possono essere specificate manualmente quando vengono richiamate. Diamo un'occhiata ad alcuni di loro.

Ignora la cartella durante la ricerca

--ignore-dir=dist

Aggiungiamo un tipo di file personalizzato -vue.

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

Ora puoi utilizzare l'opzione --vue per cercare i file .vista. Per esempio: ack --vue App.
È possibile specificare un elenco di estensioni per questa opzione. Ad esempio, qui, quando si utilizza -vue, verrà elaborato quanto segue:
file .js.

Ignora i file, ad esempio minimizzati *.min.js

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

Installazione

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

Installazione dal sito

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

Plugin per gli editor:

conclusione

Queste non sono tutte le possibilità. L'elenco completo delle funzioni può essere visualizzato eseguendo:

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

L'utilità ack consente di rendere la ricerca nel terminale più comoda e flessibile. E utilizzando la pipeline (ack -C 10 ciao | ack mondo) è possibile creare una potente combinazione per la ricerca e il filtraggio dei dati nel file system e nei file stessi.

Fonte: habr.com

Aggiungi un commento