Хочу розповісти про одну утиліту для пошуку, яка дуже спрощує життя. Коли я потрапляю на сервер і мені треба щось пошукати я насамперед перевіряю, чи встановлено 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/
А якщо потрібно і те, й інше, то використовуйте (-З)
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 -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