Ack lepszy niż grep

Chcę opowiedzieć o narzędziu do wyszukiwania, które znacznie ułatwia życie. Kiedy wchodzę na serwer i muszę coś znaleźć, pierwszą rzeczą, którą sprawdzam, jest to, czy ack jest zainstalowane. To narzędzie jest doskonałą alternatywą dla grep oraz w pewnym stopniu find i wc. Dlaczego nie grep? Ack ma bardziej przyjazne domyślne ustawienia, bardziej czytelne opcje, wyrażenia regularne w perl oraz system konfiguracji. Jeśli lubisz (musisz) szukać za pomocą terminala, zdecydowanie powinieneś to wypróbować.

Podstawowe możliwości

Ack domyślnie jest rekurencyjny, a pisanie mniej opcji zawsze jest dobre.

Możemy użyć flagi -w, aby powiedzieć narzędziu, żeby szukało wystąpienia naszego wzoru otoczonego granicami słów (symbolami białymi, ukośnikami itd.).

ack -w mysql

Ack lepszy niż grep

Ack obsługuje wyszukiwanie według typu plików. Na przykład znajdźmy wersję modułu w plikach json.

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

Ack lepszy niż grep

Pełną listę obsługiwanych typów plików można zobaczyć za pomocą:

ack --help-types

Często trzeba policzyć, ile razy fraza występuje w pliku dziennika, na przykład, aby zrozumieć, ile danych przetworzył skrypt.

Ack lepszy niż grep
Policzmy, ile razy process występuje w pliku test.log, ignorując wielkość liter (-i).

Możemy policzyć wystąpienia nie tylko w jednym konkretnym pliku, ale w grupie. Dopracujmy poprzednie wyszukiwanie słowa mysql: policzmy liczbę wystąpień słów (-c) w plikach *.js (--js), wykluczając pliki, w których nic nie zostało znalezione (-h) i sumując wyniki.

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

Ack lepszy niż grep

Ponadto możemy uzyskać szczegółowy raport o liczbie wystąpień w każdym pliku za pomocą (-l)

ack --js -w -cl mysql

Ack lepszy niż grep

Jeśli potrzebujesz dodatkowego kontekstu dla wyszukiwania, możesz poprosić ack
aby pokazał linie przed (-B) i po (-A) znalezionym wyrażeniu. W tym celu trzeba podać po opcji liczbę linii, które należy pokazać.

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

Ack lepszy niż grep

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

Ack lepszy niż grep

A jeśli potrzebujesz zarówno jednego, jak i drugiego, użyj (-C)

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

Istnieje również opcja (-v) do odwrócenia wyszukiwania, tzn. pokazania linii, w których nie ma podanego wzoru.

Wyrażenie regularne

Ack w przeciwieństwie do grepa używa wyrażeń zgodnych z Perlem.
Dla mnie to duży plus, nie muszę zapamiętywać osobnej składni dla wyrażeń regularnych.

ack 'vars+adds+'

Ack lepszy niż grep

Bardziej złożony przykład

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

Ack lepszy niż grep

Często chce się w wynikach pozostawić tylko to, co pasuje do wzoru. Tu pomoże opcja —output (-o)

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

Ack lepszy niż grep

Oprócz tego, za pomocą nawiasów okrągłych możemy wyodrębnić znalezioną część i odwołać się do niej w wyjściu przez zmienną $[numer grupy]. Na przykład,

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

Ack lepszy niż grep

Ack ma przydatne opcje —range-start i —range-end. Pomagają, gdy
dane są przechowywane w formie wielowierszowej, a nie pojedynczej linii.

Na przykład, mamy plik z kodem sql

Ack lepszy niż grep

Wyodrębnijmy nazwy kolumn. Początkiem bloku będzie linia zaczynająca się od SELECT, a końcem linia zaczynająca się od FROM.

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

Ack lepszy niż grep

Jeśli w wyrażeniu wyszukiwania występują znaki specjalne, takie jak kropka, nawias okrągły i inne, aby ich nie eskalować za pomocą , można użyć opcji -Q.

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

Ack lepszy niż grep

Praca z plikami

Uzyskaj listę plików o określonym rozszerzeniu

ack -f --js

Ack lepszy niż grep

Znajdź wszystkie pliki js, których nazwa zaczyna się na P*, używając opcji (-g).

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

Ack lepszy niż grep

Konfiguracja

Narzędzie ma swój plik konfiguracyjny. Można mieć zarówno globalną konfigurację dla użytkownika (~/.ackrc), jak i lokalną dla konkretnego folderu (w folderze należy stworzyć plik .ackrc).

Większość opcji, które są zapisane w konfiguracjach, można również podać ręcznie przy wywołaniu. Rozważmy kilka z nich.

Ignoruj folder podczas wyszukiwania

--ignore-dir=dist

Dodajmy niestandardowy typ pliku —vue.

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

Teraz możemy użyć opcji —vue do wyszukiwania w plikach .vue. Na przykład: ack —vue App.
Można również podać listę rozszerzeń dla tej opcji. Na przykład, tutaj przy użyciu —vue będą przetwarzane również
.js pliki.

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

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

Instalacja

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

Instalacja ze strony

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

Wtyczki do edytorów:

Podsumowanie

To nie wszystkie możliwości. Pełną listę funkcji można zobaczyć, wykonując:

ack --help
# lub
ack --man

Narzędzie ack umożliwia wygodniejsze i bardziej elastyczne wyszukiwanie w terminalu. A za pomocą pipeline (ack -C 10 hello | ack world) można stworzyć potężny kombajn do wyszukiwania i filtrowania danych w systemie plików oraz w samych plikach.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster