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

Дадаць каментар