Жадаю распавесці аб адной утыліце для пошуку, якая вельмі моцна спрашчае жыццё. Калі я трапляю на сервер і мне трэба нешта пашукаць я перш за ўсё правяраю ці ўсталяваны 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