Искам да разкажа за един инструмент за търсене, който значително улеснява живота. Когато попадам на сървър и трябва да търся нещо, първото нещо, което проверявам, е дали ack е инсталиран. Този инструмент е отлична алтернатива на grep, а до известна степен и на find и wc. Защо не grep? Ack предлага по-приятни настройки от самото начало, по-читаеми опции, Perl регулярки и система за конфигурация. Ако обичате (или трябва) да търсите през терминала, определено трябва да го опитате.
Основни функции
Ack по подразбиране е рекурсивен, а винаги е хубаво да пишете по-малко опции.
Можем да използваме флага -w, за да кажем на инструмента да търси примери на нашия шаблон, окружени с граници на думите (пробелни символи, наклонена черта и т.н.).
ack -w mysql
Ack поддържа търсене по тип файлове. Например, да намерим версия на модула в json файлове.
ack --json '"version":s+"d+.d+.d+"'
Пълният списък на поддържаните типове файлове можете да видите с помощта на:
ack --help-typesЧесто е необходимо да преброим колко пъти фразата се среща в лог файл, например, за да разберем колко данни е обработил скриптът.
![]()
Броим колко пъти process се среща в файла test.log, без да вземем предвид регистра (-i).
Можем да преброим срещанията не просто в един конкретен файл, а в група. Нека подобрим предходното търсене на думата mysql: да преброим броя на срещанията на думите (-с) в *.js файлове (—js), изключвайки файлове, в които нищо не е намерено (-h) и да обобщим резултата.
# выведем на экран все вхождения
ack --js -w mysql
# считаем общую сумму вхождений
ack --js -wch mysql
Освен това, можем да получим подробен отчет за броя на срещанията в всеки файл с помощта на (-l)
ack --js -w -cl mysql
Ако ви е необходим допълнителен контекст за търсенето, можете да поискате от ack
да покаже редовете преди (-B) и след (-A) намереното изражение. За целта е необходимо да посочите след опцията броя на редовете, които искате да покажете.
# 2 строки до
ack --js --column -B 2 "query.once('" ./lib/
# 2 строки после
ack --js --column -A 2 "query.once('" . /lib/
А ако ви е нужно и двете, използвайте (-C)
ack --js --column -C 2 "query.once('" .\/lib\/Съществува и опция (-v) за инвертиране на търсенето, т.е. да показва редове, в които няма зададения шаблон.
Регулярни изрази
Ack, за разлика от grep, използва Perl-съвместими изрази.
За мен това е голямо предимство, не се налага да запомням различен синтаксис за регулярки.
ack 'vars+adds+'
По-сложен пример
ack '*s+[vd+.d+.d+]'
Често искаме в резултатите да оставим само това, което съвпада с шаблона. Тук ще помогне опцията —output (-o)
ack -o '*s+[vd+.d+.d+]'
Освен това, чрез кръгли скоби можем да изолираме намерената част и да се обърнем към нея в output чрез променливата $[номер на група]. Например,
ack --output='version is $1' '*s+[v(d+.d+.d+)]'
Ack разполага с полезни опции —range-start и —range-end. Те помагат, когато
данните не са събрани в един ред, а в много редове.
Например, имаме файл с sql код

Извлечем имената на колоните. Началото на блока ще бъде ред, който започва с SELECT, а краят — ред, който започва с FROM.
ack --range-start ^SELECT --range-end ^FROM 'td+.' ./test.sql
Ако в търсенето участват специални символи, като точка, кръгла скоба и други, не е нужно да ги екранираме с помощта на , можем да използваме опцията -Q.
# Поиск с экранированием
ack --json 'mysql.'
# Поиск без экранирования
ack --json -Q mysql.
Работа с файлове
Да получим списък с файлове с определено разширение
ack -f --js
Да намерим всички js файлове, чиито имена започват с P*, използвайки опцията (-g).
ack -g --js '/Pa.+.js$'
Конфигурация
Утилитата разполага със свой конфигурационен файл. Може да имаме както глобален конфиг за потребителя (~/.ackrc), така и локален за конкретна папка (в папката трябва да създадем файл .ackrc).
Повечето опции, които се задават в конфигурационните файлове, могат да бъдат зададени и ръчно при извикването. Нека разгледаме няколко от тях.
Игнориране на папка при търсене
--ignore-dir=distДобавяме персонализиран тип файл —vue.
--type-add=vue:ext:js,vueСега можем да използваме опцията —vue за търсене в файлове .vue. Например: ack —vue App.
При това можем да зададем списък с разширения за тази опция. Например, тук при използване на —vue ще бъдат обработени и .js файлове.
Игнорировать файлы, например, минифицированные *.min.js
--ignore-file=match:/\.min.js$/Инсталиране
CentOS
yum update -y && yum install ack -yUbuntu
apt-get update -y && apt-get install ack-grep -yMac OS
brew update && brew install ackИнсталация от сайта
curl https://beyondgrep.com/ack-v3.3.1 > ~/bin/ack && chmod 0755 ~/bin/ackПлъгини за редактори:
Заключение
Това далеч не е всичко. Пълен списък с функции можете да видите, изпълнявайки:
ack –-help
# или
ack --manУтилитата ack улеснява и прави търсенето в терминала по-гъвкаво. Чрез pipeline (ack -C 10 hello | ack world) можете да създадете мощен инструмент за търсене и филтриране на данни в файловата система и самите файлове.
Източник: habr.com
