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

А ако ви е нужно и двете, използвайте (-C)

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

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