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: порахуємо кількість входжень слів () в *.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

До того ж, за допомогою круглих дужок ми можемо виділити знайдену частину і звернутися до неї в output через змінну $[номер групи]. Наприклад,

ack --output='version is $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

Додати коментар або відгук