Ack besser als grep

Ich möchte über ein Suchwerkzeug sprechen, das das Leben erheblich erleichtert. Wenn ich auf einen Server komme und etwas suchen muss, überprüfe ich zunächst, ob ack installiert ist. Dieses Werkzeug ist ein hervorragender Ersatz für grep und in gewissem Maße auch für find und wc. Warum nicht grep? Ack bietet angenehmere Standardeinstellungen, menschenlesbare Optionen, Perl-reguläre Ausdrücke und ein Konfigurationssystem. Wenn Sie gerne (oder müssen) über das Terminal suchen, sollten Sie es unbedingt ausprobieren.

Grundlegende Funktionen

Ack ist standardmäßig rekursiv, und es ist immer gut, weniger Optionen anzugeben.

Wir können das Flag -w, verwenden, um dem Werkzeug zu sagen, dass es nach einer Instanz unseres Musters suchen soll, umgeben von Wortgrenzen (Leerzeichen, Schrägstrich usw.).

ack -w mysql

Ack besser als grep

Ack unterstützt die Suche nach Dateitypen. Zum Beispiel suchen wir die Version eines Moduls in JSON-Dateien.

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

Ack besser als grep

Die vollständige Liste der unterstützten Dateitypen kann mit folgendem Befehl abgerufen werden:

ack --help-types

Oft muss gezählt werden, wie oft ein Ausdruck in einer Protokolldatei erscheint, um zu verstehen, wie viele Daten das Skript verarbeitet hat.

Ack besser als grep
Zählen wir, wie oft das Wort process in der Datei test.log erscheint, ohne die Groß-/Kleinschreibung zu berücksichtigen (-i).

Wir können Vorkommen nicht nur in einer bestimmten Datei, sondern in einer Gruppe zählen. Lassen Sie uns die vorherige Suche nach dem Wort mysql erweitern: Zählen wir die Anzahl der Vorkommen des Worts (-c) in *.js-Dateien (—js), wobei wir Dateien ausschließen, in denen nichts gefunden wurde (-h) und die Ergebnisse summieren.

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

Ack besser als grep

Darüber hinaus können wir einen detaillierten Bericht über die Anzahl der Vorkommen in jeder Datei mit (-l)

ack --js -w -cl mysql

Ack besser als grep

Wenn Sie zusätzlichen Kontext für die Suche benötigen, können Sie ack bitten,
die Zeilen vor (-B) und nach (-A) dem gefundenen Ausdruck anzuzeigen. Dazu müssen Sie die Anzahl der Zeilen angeben, die angezeigt werden sollen.

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

Ack besser als grep

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

Ack besser als grep

Wenn Sie beides benötigen, verwenden Sie (-C)

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

Es gibt auch die Option (-v) für eine umgekehrte Suche, d.h. Zeilen anzuzeigen, in denen das angegebene Muster nicht vorhanden ist.

Reguläre Ausdrücke

Ack verwendet im Gegensatz zu grep Perl-kompatible Ausdrücke.
Für mich ist das ein großer Vorteil, da ich mir keinen separaten Syntax für reguläre Ausdrücke merken muss.

ack 'vars+adds+'

Ack besser als grep

Ein komplexeres Beispiel

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

Ack besser als grep

Oft möchte ich in den Ergebnissen nur das behalten, was mit dem Muster übereinstimmt. Hier hilft die Option —output (-o)

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

Ack besser als grep

Darüber hinaus können wir mit Hilfe von runden Klammern den gefundenen Teil hervorheben und über die Variable $[Gruppennummer] darauf im Output zugreifen. Zum Beispiel,

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

Ack besser als grep

Ack hat nützliche Optionen —range-start und —range-end. Sie helfen, wenn
Daten nicht in einer Zeile gespeichert sind, sondern mehrzeilig dargestellt werden.

Zum Beispiel gibt es eine Datei mit SQL-Code

Ack besser als grep

Lass uns die Spaltennamen extrahieren. Der Block beginnt mit einer Zeile, die mit SELECT beginnt, und endet mit einer Zeile, die mit FROM beginnt.

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

Ack besser als grep

Wenn spezielle Zeichen wie Punkt, runde Klammer und andere im Suchausdruck vorkommen, dann kann man statt sie zu maskieren, die Option -Q.

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

Ack besser als grep

Arbeit mit Dateien

Eine Liste von Dateien mit einer bestimmten Erweiterung erhalten

ack -f --js

Ack besser als grep

Alle JS-Dateien finden, deren Namen mit P* beginnen, unter Verwendung der Option (-g).

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

Ack besser als grep

Konfiguration

Das Tool hat seine eigene Konfigurationsdatei. Man kann eine globale Konfiguration für den Benutzer (~/.ackrc) und eine lokale für einen bestimmten Ordner haben (im Ordner muss die Datei .ackrc erstellt werden).

Die meisten Optionen, die in die Konfigurationen geschrieben werden, können auch manuell beim Aufruf angegeben werden. Lassen Sie uns einige davon betrachten.

Ordner bei der Suche ignorieren

--ignore-dir=dist

Wir fügen einen benutzerdefinierten Dateityp – vue hinzu.

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

Jetzt kann man die Option —vue verwenden, um in den Dateien .vue zu suchen. Zum Beispiel: ack —vue App.
Dabei kann eine Liste von Erweiterungen für diese Option angegeben werden. Zum Beispiel werden hier bei der Verwendung von —vue auch
.js Dateien verarbeitet.

Игнорировать файлы, например, минифицированные *.min.js

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

Installation

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

Installation von der Website

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

Plugins für Editoren:

Fazit

Das sind längst nicht alle Möglichkeiten. Die vollständige Liste der Funktionen kann durch Ausführung von

ack –-help
# oder
ack --man

Das Tool ack ermöglicht eine angenehmere und flexiblere Suche im Terminal. Und mit Hilfe von Pipeline (ack -C 10 hello | ack world) kann man eine leistungsstarke Kombination zur Suche und Filterung von Daten im Dateisystem und in den Dateien selbst erstellen.

Quelle: habr.com

60GB SSD 8Gb DDR4