Ack е по-добър от grep

Искам да ви разкажа за една утилита за търсене, която много улеснява живота. Когато вляза на сървър и трябва да потърся нещо, първото нещо, което правя, е да проверя дали е инсталиран ack. Тази утилита е отлична алтернатива на grep, а също така до известна степен на find и wc. Защо не grep? Ack има по-добри настройки по подразбиране, по-четими опции, Perl регулярни изрази и конфигурационна система. Ако обичате (или е нужно) да търсите през терминала, определено трябва да я опитате.

Основни възможности

Ack по подразбиране е рекурсивен и да пишеш по-малко опции винаги е добре.

Можем да използваме флага -w, за да кажем на утилитата да търси пример на нашия шаблон, заобиколен от граници на думите (пробелни символи, наклонени черти и т.н.).

ack -w mysql

Ack е по-добър от grep

Ack поддържа търсене по тип файлове. Например, да намерим версията на модула в json файлове.

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

Ack е по-добър от grep

Пълен списък с поддържани типове файлове можете да видите с помощта на:

ack --help-types

Често е необходимо да преброим колко пъти фраза се среща в лог файл, например, за да разберем колко данни е обработил скриптът.

Ack е по-добър от grep
Да преброим колко пъти process се среща във файла test.log, без да се взема предвид регистърът (-i).

Можем да преброим появите не само в един конкретен файл, а в група. Нека да доработим предишното търсене на думата mysql: да преброим колко пъти думите (-c) се срещат в *.js файлове (—js), изключвайки файловете, в които нищо не е намерено (-h) и сумирайки общото.

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

Ack е по-добър от grep

Освен това можем да получим подробен отчет за броя на появите във всеки файл с помощта на (-l)

ack --js -w -cl mysql

Ack е по-добър от grep

Ако ви е необходим допълнителен контекст за търсенето, можете да накарате ack
да покаже редовете преди (-B) и след (-A) намереното изразяване. За целта трябва да укажете след опцията колко реда искате да се покажат.

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

Ack е по-добър от grep

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

Ack е по-добър от grep

А ако искате и двете, използвайте ()

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

Има също опция (-v) за инвертиране на търсенето, т.е. да показвате редове, в които няма зададения шаблон.

Регулярни изрази

Ack за разлика от grep използва Perl-съвместими изрази.
За мен това е голямо предимство, не е нужно да запомням отделен синтаксис за регулярни изрази.

ack 'vars+adds+'

Ack е по-добър от grep

По-сложен пример

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

Ack е по-добър от grep

Често искаме в резултатите да оставим само това, което съвпада с шаблона. Тук помага опцията —output (-o)

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

Ack е по-добър от grep

Освен това, с помощта на кръгли скоби можем да изолираме намерената част и да се обърнем към нея в изхода чрез променливата $[номер на група]. Например,

ack --output='версията е $1' '*s+[v(d+.d+.d+)]'

Ack е по-добър от grep

Ack предлага полезни опции —range-start и —range-end. Те помагат, когато
данните не се съхраняват в една редица, а в многоредов вид.

Например, имаме файл със SQL код

Ack е по-добър от grep

Извлечем имената на колоните. Началото на блока ще бъде ред, който започва с SELECT, а краят ред, който започва с FROM.

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

Ack е по-добър от grep

Ако в търсенето участват специални символи като точка, кръгла скоба и други, за да не ги е необходимо да се екранират чрез , можем да използваме опцията -Q.

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

Ack е по-добър от grep

Работа с файлове

Получаване на списък с файлове с определено разширение

ack -f --js

Ack е по-добър от grep

Намиране на всички js файлове, чието име започва с P*, използвайки опцията (-g).

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

Ack е по-добър от grep

Конфигурация

Утилитата разполага с конфигурационен файл. Може да има както глобален конфиг за потребителя (~/.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 -y

Ubuntu

apt-get update -y && apt-get install ack-grep -y

Mac 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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster