Искам да ви разкажа за една утилита за търсене, която много улеснява живота. Когато вляза на сървър и трябва да потърся нещо, първото нещо, което правя, е да проверя дали е инсталиран 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: да преброим колко пъти думите (-c) се срещат в *.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/
А ако искате и двете, използвайте (-С)
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+]'
Освен това, с помощта на кръгли скоби можем да изолираме намерената част и да се обърнем към нея в изхода чрез променливата $[номер на група]. Например,
ack --output='версията е $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
