grep

Използване на grep (и egrep) с регулярни изрази

Използване на grep (и egrep) с регулярни изрази
Този урок описва как да използвате и двете grepегреп) тo намиране на текст във файлове, в опростената им форма и в комбинация с регулярни изрази. Съдържа няколко примери и упражнения, плюс решения, за да завърши зрителят.

Името grep идва от командата ed (и vim) „g / re / p“, което означава глобално търсене на даден регулярен израз и отпечатване (показване) на изхода.

Редовен Изрази

Помощните програми позволяват на потребителя да търси текстови файлове за редове, които съответстват на регулярен израз (регулярно изражение). Регулярният израз е низ за търсене, съставен от текст и един или повече от 11 специални знака. Един прост пример е съвпадение на началото на ред.

Примерен файл

Основната форма на grep може да се използва за намиране на прост текст в определен файл или файлове. За да изпробвате примерите, първо създайте примерния файл.

Използвайте редактор като nano или vim, за да копирате текста по-долу във файл, наречен myfile.

xyz
xyzde
exyzd
dexyz
д?gxyz
xxz
xzz
x \ z
x * z
xz
x z
XYZ
XYYZ
xYz
xyyz
xyyyz
xyyyyz

Въпреки че можете да копирате и поставите примерите в текста (имайте предвид, че двойните кавички може да не се копират правилно), командите трябва да бъдат въведени, за да ги научите правилно.

Преди да изпробвате примерите, прегледайте примерния файл:

$ cat myfile

Просто търсене

За да намерите текста 'xyz' във файла, изпълнете следното:

$ grep xyz myfile

Използване на цветове

За да покажете цветове, използвайте -color (двоен тире) или просто създайте псевдоним. Например:

$ grep --color xyz myfile

или

$ alias grep = 'grep --color'
$ grep xyz myfile

Настроики

Често използвани опции с grep команда включва:

Например:

$ grep -i xyz myfile # намери текст независимо от случая
$ grep -ic xyz myfile # преброяване на редове с текст
$ grep -in xyz myfile # показва номера на редове

Създаване на множество файлове

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

$ echo xyz> myfile1
$ echo -e “xyz \ nxzz \ nXYZ”> myfile2
$ echo -e “xxx \ nyyy”> myfile3
$ cat myfile1
$ cat myfile2
$ cat myfile3

Търсене в множество файлове

За да търсите в множество файлове, като използвате имена на файлове или заместващ знак, въведете:

$ grep -ic xyz myfile myfile1 myfile2 myfile3
$ grep -in xyz my * 
# съвпадат имената на файлове, започващи с 'my'

Упражнение I

  1. Първо пребройте колко реда има във файла / etc / passwd.
Съвет: използвайте wc -l / etc / passwd
  1. Сега намерете всички появявания на текста вар във файла / etc / passwd.
  2. Намерете колко реда във файла съдържат текста
  3. Намерете колко реда НЕ съдържат текста вар.
  4. Намерете записа за вашето влизане в / и т.н. / passwd

Решения за упражнения можете да намерите в края на тази статия.

Използване на регулярни изрази

Командата grep може да се използва и с регулярни изрази, като се използва един или повече от единадесет специални знака или символа за прецизиране на търсенето. Регулярният израз е символен низ, който включва специални символи, за да позволи съвпадение на шаблони в помощни програми като grep, vim и сед. Имайте предвид, че струните може да се наложи да бъдат затворени в кавички.

Наличните специални знаци включват:

^ Начало на линия
$ Край на ред
. Всеки символ (с изключение на \ n нов ред)
* 0 или повече от предишния израз
\ Предшестващият символ го прави буквален знак

Имайте предвид, че *, което може да се използва в командния ред за съвпадение на произволен брой символи, включително нито един, е не използвани по същия начин тук.

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

Примери

За да намерите всички редове, започващи с текст, използвайки символа ^:

$ grep '^ xyz' myfile

За да намерите всички редове, завършващи с текст, използвайки символа $:

$ grep 'xyz $' myfile

За да намерите редове, съдържащи низ, като се използват символите ^ и $:

$ grep '^ xyz $' myfile

За да намерите редове с помощта на . за да съответства на всеки символ:

$ grep '^ x.z 'myfile

За да намерите редове с помощта на *, за да съответства на 0 или повече от предишния израз:

$ grep '^ xy * z' myfile

За да намерите редове с помощта на .* за съвпадение на 0 или повече от всеки знак:

$ grep '^ x.* z 'myfile

За да намерите редове с помощта на \ да избяга от символа *:

$ grep '^ x \ * z' myfile

За да намерите символа \ използвайте:

$ grep '\\' myfile

Израз grep - egrep

The grep команда поддържа само подмножество от наличните регулярни изрази. Командата обаче егреп:

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

За да използвате цветове, използвайте -color или отново създайте псевдоним:

$ alias egrep = 'egrep --color'

За да търсите повече от един регулярно изражение на егреп команда може да бъде написана на няколко реда. Това обаче може да се направи и с помощта на тези специални знаци:

| Редуване, или едното, или другото
(...) Логическо групиране на част от израз
$ egrep '(^ root | ^ uucp | ^ поща)' / etc / passwd

Това извлича редовете, които започват с root, uucp или поща от файла, | символ, означаващ някоя от опциите.

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

$ grep '(^ root | ^ uucp | ^ поща)' / etc / passwd

На повечето Linux системи обаче командата grep -E е същото като използването егреп:

$ grep -E '(^ ​​корен | ^ uucp | ^ поща)' / и т.н. / passwd

Използване на филтри

Тръбопроводи е процесът на изпращане на изхода на една команда като вход в друга команда и е един от най-мощните налични инструменти на Linux.

Командите, които се появяват в конвейер, често се наричат ​​филтри, тъй като в много случаи те пресяват или модифицират подадения към тях вход, преди да изпратят модифицирания поток към стандартен изход.

В следващия пример, стандартен изход от ls -l се предава като стандартен вход към grep команда. Изход от grep След това командата се предава като вход към Повече ▼ команда.

Това ще покаже само директории в / и т.н:

$ ls -l / etc | grep '^ d' | повече

Следните команди са примери за използване на филтри:

$ ps -ef | grep cron

$ who | grep kdm

Примерен файл

За да изпробвате упражнението за преглед, първо създайте следния примерен файл.

Използвайте редактор като nano или vim, за да копирате текста по-долу във файл, наречен хора:

Личен J.Смит 25000
Личен Д.Смит 25400
Обучение A.Кафяво 27500
Обучение C.Браун 23400
(Администратор) R.Брон 30500
Стоки T.Смит 30000
Личен F.Джоунс 25000
обучение * C.Еванс 25500
Стоки W.Папа 30400
Партер Т.Smythe 30500
Личен J.Maler 33000

Упражнение II

  1. Покажете файла хора и разгледайте съдържанието му.
  2. Намерете всички редове, съдържащи низа Смит във файла хора.Съвет: използвайте командата grep, но не забравяйте, че по подразбиране е чувствителна към малки и големи букви.
  3. Създайте нов файл, npeople, съдържащ всички редове, започващи с низа Лични в досието на хората.Съвет: използвайте командата grep с>.
  4. Потвърдете съдържанието на файла npeople, като изброите файла.
  5. Сега добавете всички редове, където текстът завършва със низа 500 във файла хората към файла npeople.Съвет: използвайте командата grep с >>.
  6. Отново потвърдете съдържанието на файла npeople, като изброите файла.
  7. Намерете IP адреса на сървъра, който се съхранява във файла / etc / hosts.Съвет: използвайте командата grep с $ (име на хост)
  8. Използвайте егреп да извлечете от / и т.н. / passwd файлови редове, съдържащи lp или своя собствена потребителски идентификатор.

Решения за упражнения можете да намерите в края на тази статия.

Още редовни изрази

Регулярният израз може да се разглежда като заместващ знак на стероиди.

Има единадесет знака със специални значения: отварящата и затварящата квадратни скоби [], наклонената черта \, каретата ^, знака за долар $, точката или точката ., символът за вертикална лента или тръба |, въпросителен знак ?, звездичка или звезда *, знак плюс + и отваряща и затваряща кръгла скоба . Тези специални знаци също често се наричат ​​метасимволи.

Ето пълния набор от специални знаци:

^ Начало на линия
$ Край на ред
. Всеки символ (с изключение на \ n нов ред)
* 0 или повече от предишния израз
| Редуване, или едното, или другото
[…] Изричен набор от символи, които да съвпадат
+ 1 или повече от предишния израз
? 0 или 1 от предишния израз
\ Предшестващият символ го прави буквален знак
Изрична нотация на квантора
(...) Логическо групиране на част от израз

Версията по подразбиране на grep има само ограничена поддръжка на регулярни изрази. За да работят всички следващи примери, използвайте егреп вместо това или grep -E.

За да намерите редове с помощта на | да съответства на всеки израз:

$ egrep 'xxz | xzz' myfile

За да намерите редове с помощта на | за да съответства на който и да е израз в низ също използвайте ():

$ egrep '^ x (Yz | yz)' myfile

За да намерите редове с помощта на [] за съвпадение с произволен знак:

$ egrep '^ x [Yy] z' myfile

За да намерите редове с помощта на [], за да НЕ съвпадат с нито един знак:

$ egrep '^ x [^ Yy] z' myfile

За да намерите редове с помощта на *, за да съответства на 0 или повече от предишния израз:

$ egrep '^ xy * z' myfile

За да намерите редове с помощта на +, за да съответства на 1 или повече от предишния израз:

$ egrep '^ xy + z' myfile

За да намерите редове с помощта на ? да съответства на 0 или 1 от предишния израз:

$ egrep '^ xy?z 'myfile

Упражнение III

  1. Намерете всички редове, съдържащи имената Евънс или Малер във файла хора.
  2. Намерете всички редове, съдържащи имената Смит, Смит или Smythe във файла хора.
  3. Намерете всички редове, съдържащи имената Браун, Браун или Брон във файла хора.Ако имате време:
  4. Намерете реда, съдържащ низа (администратор), включително скобите, във файла хора.
  5. Намерете реда, съдържащ символа * във файла хора.
  6. Комбинирайте 5 и 6 по-горе, за да намерите и двата израза.

Още примери

За да намерите редове с помощта на . и * за съвпадение на произволен набор от знаци:

$ egrep '^ xy.* z 'myfile

За да намерите редове с помощта на за съвпадение на N броя знаци:

$ egrep '^ xy 3 z' myfile
$ egrep '^ xy 4 z' myfile

За да намерите редове с помощта на , за да съответства N или повече пъти:

$ egrep '^ xy 3, z' myfile

За да намерите редове с помощта на , за да съответства N пъти, но не повече от M пъти:

$ egrep '^ xy 2,3 z' myfile

Заключение

В този урок първо разгледахме използването grep в проста форма е да намерите текст във файл или в множество файлове. След това комбинирахме текста, който трябва да се търси, с прости регулярни изрази и след това с по-сложни, използвайки егреп.

Следващи стъпки

Надявам се, че ще приложите добре получените знания тук. Опитай grep команди върху вашите собствени данни и не забравяйте, регулярните изрази, както е описано тук, могат да се използват в същата форма в vi, сед и awk!

Решения за упражнения

Упражнение I

Първо пребройте колко реда има във файла / и т.н. / passwd.
$ wc -l / etc / passwd
Сега намерете всички повторения на текста вар във файла / etc / passwd.
$ grep var / etc / passwd
Намерете колко реда във файла съдържат текста вар

grep -c var / etc / passwd

Намерете колко реда НЕ съдържат текста вар.

grep -cv var / etc / passwd

Намерете записа за вашето влизане в / и т.н. / passwd файл
grep kdm / etc / passwd

Упражнение II

Покажете файла хора и разгледайте съдържанието му.
$ котка хора
Намерете всички редове, съдържащи низа Смит във файла хора.
$ grep "Смит" хора
Създайте нов файл, npeople, съдържащ всички редове, започващи с низа Лични в хора файл
$ grep '^ Лични' хора> npeople
Потвърдете съдържанието на файла npeople чрез изброяване на файла.
$ cat npeople
Сега добавете всички редове, където текстът завършва със низа 500 във файла хора към файла npeople.
$ grep '500 $' хора >> хора
Отново потвърдете съдържанието на файла npeople чрез изброяване на файла.
$ cat npeople
Намерете IP адреса на сървъра, който се съхранява във файла / etc / hosts.
$ grep $ (име на хост) / etc / hosts
Използвайте егреп да извлечете от / и т.н. / passwd файлови редове, съдържащи lp или вашия собствен потребителски идентификатор.
$ egrep '(lp | kdm :)' / etc / passwd

Упражнение III

Намерете всички редове, съдържащи имената Евънс или Малер във файла хора.
$ egrep „Evans | Maler“ хора
Намерете всички редове, съдържащи имената Смит, Смит или Smythe във файла хора.
$ egrep 'Sm (i | y) на?"хора
Намерете всички редове, съдържащи имената Кафяво, Браун или Брон във файла хора.
$ egrep 'Вежди?д?n 'хора
Намерете реда, съдържащ низа (администратор), включително скобите във файла хора.

$ egrep '\ (Admin \)' хора

Намерете реда, съдържащ символа * във файла хора.
$ egrep '\ *' хора
Комбинирайте 5 и 6 по-горе, за да намерите и двата израза.

$ egrep '\ (Admin \) | \ *' хора


Как да промените курсора на мишката и размера на курсора, цвета и схемата в Windows 10
Показалецът на мишката и курсорът в Windows 10 са много важни аспекти на операционната система. Това може да се каже и за други операционни системи, т...
Безплатни и игри с отворен код за разработване на Linux игри
Тази статия ще обхване списък с безплатни двигатели за игри с отворен код, които могат да се използват за разработване на 2D и 3D игри на Linux. Същес...
Урок Сянка на Tomb Raider за Linux
Shadow of the Tomb Raider е дванадесетото допълнение към поредицата Tomb Raider - франчайз за екшън-приключенска игра, създаден от Eidos Montreal. Игр...