Искам да ви разкажа за една помощна програма за търсене, която значително опростява живота. Когато стигна до сървъра и трябва да потърся нещо, първото нещо, което правя, е да проверя дали ack е инсталиран. Тази помощна програма е отличен заместител на grep, както и find и wc до известна степен. Защо не grep? Ack има по-хубави настройки от кутията, по-четими за човека опции, perl регулярен израз и система за конфигуриране. Ако обичате (трябва) да търсите през терминала, тогава определено трябва да го опитате.
Основни функции
Ack е рекурсивен по подразбиране и писането на по-малко опции винаги е добра идея.
Можем да използваме флаг -wза да кажем на помощната програма да търси екземпляр на нашия модел, заобиколен от граници на думи (бели интервали, наклонени черти и т.н.).
ack -w mysql
Ack поддържа търсене по тип файл. Например, нека намерим версията на модула в json файлове.
ack --json '"version":s+"d+.d+.d+"'
Пълен списък на поддържаните типове файлове може да се види с помощта на:
ack --help-types
Често трябва да преброите колко пъти дадена фраза се появява в регистрационен файл, например, за да разберете колко данни е обработил скриптът.
Отчитаме колко пъти се случва процес във файла 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/
И ако имате нужда от двете, използвайте (-От)
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='version is $1' '*s+[v(d+.d+.d+)]'
Ack има полезни опции --обхват-начало и --обхват-край. Те помагат, когато
Данните се съхраняват не в един ред, а в многоредов вид.
Например, има файл с 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.
Можете да посочите списък с разширения за тази опция. Например, тук, когато използвате -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 ви позволява да направите търсенето в терминала по-удобно и гъвкаво. И използвайки тръбопровод (ack -C 10 здравей | ack свят) можете да създадете мощна комбинация за търсене и филтриране на данни във файловата система и в самите файлове.
Източник: www.habr.com