Урок: Как да използвате Ack и Grep в Ubuntu 14.04

Търсете и ще намерите. В Linux система има много инструменти за търсене за бързо и точно намиране на определени локални данни.


Бихме могли да използваме командните уроци за намиране от Digital Ocean" HREF ="https://www.hostingadvice.com/external/?site=446bc9e98a55bc765badfce49aefe9e585e467ee7fdd065fe32ecfc73fdf79410824a7079171fa4c42ab3b10cc54d651fe0ac21805fea09f5bb463dd40dab693e9549ec22105349b02cead12482fc6c0370fa1598547af28613ee5a77689e3fa894d29fce618bc7f860a1ac9c2b5c02e" целеви ="_blank" отн ="noopener">намерете и намерете команди за намиране на файлове по тяхното име, тип, времеви марки, собственик или размер. Командата find може също да търси съдържанието на файла, но в повечето случаи има по-лесен инструмент за този, наречен grep. Ако искахме да търсим файл или директория за някакъв подходящ съдържателен низ, бихме могли да използваме командата grep или по-новия й алтернативен ack.

Името „grep“ означава „глобални / Regular дxpression / речат “. „G“ е съкращение от „глобално търсене“ в Unix. Grep може да се използва, за да видите дали входът на файла, който получава, съответства на определен шаблон; такива модели се наричат ​​редовни изрази и вероятно сте виждали някои от тях преди в други софтуерни инструменти. В този урок ще използваме само основите на регулярните изрази, но не забравяйте да проучите техните „по-дълбоки води“, ако е необходимо.

Пълната сила на grep и подобни инструменти наистина започва да се показва, когато комбинираме нейните операции за търсене и филтриране с други Linux команди.

Стъпка 1: Вземете няколко примерни файла с данни

За да започнете с някои общи файлови данни, нека изтеглите изходния код на jQuery от тяхното хранилище Github.

Първо, трябва да инсталираме Git, за да можем да изтегляме проекти от Github:

1 sudo apt-get install git

Сега можем да изтеглим изходния код на jquery в нашата домашна директория:

1
2

cd ~

git clone https://github.com/jquery/jquery.git

След това влезте в директорията, която току-що изтеглихме:

1 CD jquery

Нека разгледаме файловете в тази директория с помощта на командата ls:

1LS

Виждаме списък с различни типове файлове и няколко директории:

1 AUTHORS.txt bower.json build CONTRIBUTING.md външен Gruntfile.js LICENSE.txt package.json README.md src тест

Нека да видим как бихме могли да намерим съдържание в този изходен код.

Стъпка 2а: Използване на Grep

Grep идва вече инсталиран във всяка Linux система, така че няма нужда от ръчна инсталация.

Опции за команда Grep

Това е обобщение на опциите за команда grep, които ще използваме в този урок:

  • -аз прави съвпадение на букви без чувствителност към регистрите
  • -R чете всички файлове под всяка директория рекурсивно
  • показва номера на линията на всяко съвпадение
  • -° С показва броя на мачовете
  • -V инвертира съвпадението чрез избиране на несъответстващи линии
  • отпечатва само съвпадащите части на съвпадаща линия, като всяка част е в отделен изходен ред
  • -w само съвпадения на цели думи

Основни примери

Ако искате да намерите файловете, съдържащи низ „John Resig“ за всеки файл в текущата директория, въведете:

1 grep ‘Джон Ресиг’ *

Резултатът ще бъде:

1
2
3
4
5

AUTHORS.txt: Джон Ресиг <[email protected]>

grep: build: Е директория

grep: external: Е директория

grep: src: Е директория

grep: test: Е директория

„*“ Казва grep да съвпада с всички файлове в текущата директория. Ако моделът ни за търсене съдържа интервали, трябва да поставим кавички около низ за търсене (единични кавички или двойни кавички).

Ако искате да намерите файловете, съдържащи низ „Автори“ за всеки файл в текущата директория, въведете:

1 grep Автори *

Резултатът ще бъде:

1
2
3
4
5

AUTHORS.txt: Автори, подредени по първи принос.

grep: build: Е директория

grep: external: Е директория

grep: src: Е директория

grep: test: Е директория

Греп намери един съвпадащ файл и отпечата реда, който съответства на нашия модел „Автор“. Обърнете внимание, че grep не съответства на името на файла тук, а само на съдържанието на файла.

Ако бяхме въвели това вместо:

1 греп автори *

Ще видим различен съвпадащ файл, тъй като grep е чувствителен към корпуса на символите по подразбиране.

Бихме могли да използваме команден ред grep -i опция, за да включим несъвместимото по регистър съпоставяне на символи вместо да игнорираме всяка чувствителност на корпуса:

1 grep -i автори

Сега можем да видим всички съвпадения, независимо от комбинацията на корпуса на символите, която бихме могли да използваме в нашия модел на търсене.

За да извършим едно и също търсене във всички директории (в текущата ни директория), можем да добавим рекурсивната опция -r:

1 grep -i -r автори *

Сега grep ще търси всички директории и техните рекурсии, докато не бъде направено.

Същата команда може да бъде съкратена чрез комбиниране на опциите, давайки същия резултат:

1 grep -ir автори *

За да видите номерата на редовете на съвпадащите резултати, добавяме опцията -n:

1 grep -irn автори *

За да търсите в файла AUTHORS.txt за линии с домейн „gmail.com“:

1 grep -i gmail.com AUTHORS.txt

Ако искахме да преброим всички съвпадения от предишното търсене, бихме добавили опцията -c:

1 grep -ic gmail.com AUTHORS.txt

Ще видим отпечатан номер, указващ броя на съвпадащите линии.

За да инвертираме предишния си модел на търсене „gmail.com“, ще използваме опцията -v:

1 grep -iv gmail.com

Сега виждаме всички редове без низ “gmail.com” – доста удобна функция.

Можем да търсим и съвпадения с цели думи. Позволява да се търси, безразлично към регистъра, думата „бъг“.

1 греп -i -w бъг *

Опцията -w принуждава нашия модел да се съпоставя само върху цели думи, така че думите, съдържащи низа „бъг“ (например „бъгове“), не биха били валидно съвпадение.

Ако искаме да разберем колко пъти е спомената думата „jquery“ през целия изходен код, ние ще изпратим „|”И след това поставете командата wc wordcount с -l филтър, така че броим само редовете – не и броя на думите или знаците. Опцията -o се използва за отпечатване на всяка съвпадаща част на отделен изходен ред, или броят ни не би бил правилен.

1 grep -iro jquery * | wc -l

Ако извършим търсене, което връща много съвпадения, можем да прехвърлим греп изхода на по-малко. Less е инструмент за пейджинг, който улеснява превъртането през целия изход, използвайки или двата , , Клавиши „страници нагоре“ или „страници надолу“ или лентата SPACE.

1 grep -ir jquery * | по-малко

Също така можем да свържем няколко греп команди, за да направим лесно филтриране на резултатите от всяка предишна команда.

1 grep -ir jquery * | grep -i json | по-малко

Разширени примери

За да създадем много по-прецизни съвпадащи модели, ще трябва да използваме регулярни изрази.

Например, да кажем, че искахме да намерим авторите с първо име на „Крис“ или „Джон“, но не и „Кристофър“, „Кристиан“ или друг модел на първо име.

1 grep -E "(^ Крис) | (^ Джон)" AUTHORS.txt

И voilà, виждаме всички автори с първо име на Крис или Джон.

Опцията -E казва grep да интерпретира нашия модел на търсене като разширен редовен израз. Този модел съдържа две съвпадат части „(^ Крис)“ и „(^ Джон)“, които са разделени от символа на тръбата: „|“, което представлява логика или функция. Ако някоя от двете части съвпада, отпечатваме резултата. За да търсим само имената, използваме символа caret „^”, който представлява функция за начален ред. Така че ние искаме само нашите модели да съвпадат в началото на редовете.

Ако искате да научите повече за използването на греп с редовен израз, вижте този урок. Овладяването на регулярни изрази е умение, върху което си струва да се работи.

Стъпка 2b: Използване на Ack

Ack е инструмент за търсене като просто греп, но е оптимизиран за търсене в дървета с изходен код. Ack прави почти всичко, което прави греп, но се различава по следните начини.

Ack е проектиран да:

  • По подразбиране търсейте директории рекурсивно
  • Лесно изключвайте определени типове файлове или само търсете определени типове файлове
  • Игнорирайте стандартните директории за управление на версиите по подразбиране; това са директории с имена като: .git, .gitignore, .svn
  • Игнорирайте двоичните файлове по подразбиране; това са файлове като: двоични изпълними файлове, файлове с изображения / музика / видео, архивни файлове gzip / zip / tar
  • По-добре подчертавайте мачовете, а също и да форматирате изхода малко по-чисто

Като се има предвид, един случай, в който греп често е по-бърз от ack е, ако търсите много големи файлове, които търсят с помощта на редовни изрази.

Инсталиране на Ack

За да започнете, първата стъпка е да инсталирате инструмента ack на вашата машина.

На Ubuntu или Debian машина това е толкова просто, колкото инсталирането на помощната програма от хранилищата по подразбиране. Пакетът се нарича ack-grep:

1
2

sudo apt-get update

sudo apt-get install ack-grep

Програмата се нарича ack-grep или ack?

Името на програмата е „ack.“ Някои пакетиращи го наричат ​​„ack-grep“, когато създават пакети, защото там вече има пакет, наречен „ack“, който няма нищо общо с този ack. Можем да кажем на нашата Linux система да съкрати тази команда до „ack“, ако искаме, като напишете тази команда:

1 sudo dpkg-divert –local –divert / usr / bin / ack – име –add / usr / bin / ack-grep

Сега, инструментът ще отговори на името “ack” вместо “ack-grep.”

Опции за командване на Ack

Това е обобщение на опциите за команда ack, които ще използваме в неговия урок:

  • -аз прави съвпадение на букви без чувствителност към регистрите
  • -F-X отпечатва само файловете, които биха били търсени, без всъщност да търсят, където „X“ означава филип (напр. „–html“)
  • не се спуска в никакви поддиректории.
  • -w съвпада само с цели думи
  • -тип = NOx изключва определени типове файлове от търсенето, където „X“ означава, че филатипът се изключва (напр. „–type = nophp“ за изключване на PHP файлове)

Основни примери

Нека отново потърсим в нашето изходно дърво на jQuery, за да видим как ack оптимизира търсенето на код.

1 ack -i Автори *

Виждаме този резултат:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

RS.txt

1: Автори подредени по първи принос.

 

bower.json

12: "AUTHORS.txt",

 

външен / пръщене / MIT-License.txt

18: НЕНАРУШАВАНЕ. В НИКАКВИ СЛУЧАЙ НЕ ИЗКЛЮЧВАЙТЕ АВТОРИТЕ ИЛИ ПРАВИТЕЛИТЕ НА КОПИРОВА ПРАВА

 

външен / qunit / MIT-License.txt

18: НЕНАРУШАВАНЕ. В НИКАКВИ СЛУЧАЙ НЕ ИЗКЛЮЧВАЙТЕ АВТОРИТЕ ИЛИ ПРАВИТЕЛИТЕ НА КОПИРОВА ПРАВА

 

license.txt

27: НЕНАРУШАВАНЕ. В НИКАКВИ СЛУЧАЙ НЕ ИЗКЛЮЧВАЙТЕ АВТОРИТЕ ИЛИ ПРАВИТЕЛИТЕ НА КОПИРОВА ПРАВА

 

package.json

10: "URL": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"

41: "грухтене-Git автори": "1.2.0",

Сравнете горния изход с греп версията на това търсене:

1 grep -i Автори *

Виждаме този резултат:

1
2
3
4
5
6
7
8
9

AUTHORS.txt: Автори, подредени по първи принос.

bower.json: "AUTHORS.txt",

grep: build: Е директория

grep: external: Е директория

License.txt: НЕНАРУШАВАНЕ. В НИКАКВИ СЛУЧАЙ НЕ ИЗКЛЮЧВАЙТЕ АВТОРИТЕ ИЛИ ПРАВИТЕЛИТЕ НА КОПИРОВА ПРАВА

package.json: "URL": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt"

package.json: "грухтене-Git автори": "1.2.0",

grep: src: Е директория

grep: test: Е директория

Забележете как търсенето на ack се извършва рекурсивно по подразбиране и всеки мач се отпечатва в собствен ред с номер на ред по подразбиране. Форматирането е малко по-лесно за четене, особено когато има много съвпадения.

Тези настройки по подразбиране и форматиране са приятни, когато често търсите кодови дървета.

Ack обаче може да направи повече от това. Да намерим всички HTML файлове в изходното дърво.

1 ack -f –html

Опцията -f отпечатва само файловете, които биха били търсени, без всъщност да се извършва търсене. Опцията –html е особеност на ack. Ack разбира много типове файлове и като посочите тази опция, вие я молите да търси само HTML файлове.

Нека търсим всички JavaScript файлове, без чувствителност към регистъра, за думата „бъг“.

1 ack -i -w –js бъг

Опцията –js казва на ack да търси само в JavaScript файлове. Можете да търсите всички видове други типове файлове, напр. –Php, –python, –perl и др. Това филтриране въз основа на тип файл ще направи търсенията ви много по-бързи, особено при по-големи дървета с източници.

Понякога не искаме да правим рекурсивно търсене. За да търсим в текущата директория само за думата „бъг“, ние въвеждаме:

1 ack -n -w бъг

Опцията -n казва на ack да не се спуска в никакви поддиректории.

Нека направим рекурсивно търсене на думата „css“, но изключваме всички JavaScript файлове:

1 ack -w –type = nojs css

Опцията –type = noX позволява изключването на файлови типове, известни от ack, където „X“ означава типа на файла да бъде изключен.

Разширени примери

Същият редовен израз, който използвахме с греп, ще работи и за ack:

1 АСК "(^ Крис) | (^ Джон)" AUTHORS.txt

Ack може да предложи много повече от това, което беше показано тук. Вижте официалната документация за по-задълбочен поглед върху използването на ack.

Други инструменти, подобни на греп

Ето някои други страхотни инструменти за търсене, които си струва да проучите:

  • zgrep – Инструмент за грейп, който може да търси компресирани файлове (напр. Компресирани файлове)
  • agrep – Грепоподобен инструмент с поддръжка за приблизителни модели
  • JQ – Инструмент за команден ред за търсене в JSON файлове и структуриране на получения резултат (като валиден JSON)
  • xgrep, xmlgrep, xmlstar – Това са подобни инструменти за команден ред за търсене на съдържанието на XML файлове
  • pdfgrep – Инструмент за команден ред за търсене на съдържанието на PDF файлове
  • git grep – Вграден инструмент за търсене на системата за версия на Git
Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me