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 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+"'
Pełną listę obsługiwanych typów plików można zobaczyć za pomocą:
ack --help-typesCzęsto trzeba policzyć, ile razy fraza występuje w pliku dziennika, na przykład, aby zrozumieć, ile danych przetworzył skrypt.
![]()
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
Ponadto możemy uzyskać szczegółowy raport o liczbie wystąpień w każdym pliku za pomocą (-l)
ack --js -w -cl mysql
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/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
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+'
Bardziej złożony przykład
ack '*s+[vd+.d+.d+]'
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+]'
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 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

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
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.
Praca z plikami
Uzyskaj listę plików o określonym rozszerzeniu
ack -f --js
Znajdź wszystkie pliki js, których nazwa zaczyna się na P*, używając opcji (-g).
ack -g --js '/Pa.+.js$'
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=distDodajmy niestandardowy typ pliku —vue.
--type-add=vue:ext:js,vueTeraz 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 -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackInstalacja ze strony
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackWtyczki do edytorów:
Podsumowanie
To nie wszystkie możliwości. Pełną listę funkcji można zobaczyć, wykonując:
ack --help
# lub
ack --manNarzę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
