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

Using Grep With Regular Expressions



Този урок описва как да използвате и двете захващанечапла) t o намиране на текст във файлове, в тяхната проста форма и в комбинация с регулярни изрази. Той съдържа няколко примери и упражнения , Повече ▼ решения , за да завърши зрителят.

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







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

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



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

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



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





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

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

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



$коткаmyfile

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

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

$захващанеxyz myfile

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

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

$захващане -цвятxyz myfile

или

$псевдоним захващане= 'захващане-цвят '
$захващанеxyz myfile

Настроики

Общи опции, използвани с захващане командата включва:

  • -намирам всички редове независимо на случая
  • -° С броя колко реда съдържа текста
  • -n линия на дисплея числа на съвпадащи линии
  • -само на дисплея файл имена този мач
  • -r рекурсивен търсене на поддиректории
  • -v намирам всички редове НЕ съдържащи текста

Например:

$захващане -ixyz myfile# намиране на текст независимо от случая

$захващане -интегрална схемаxyz myfile# бройте редове с текст

$захващане xyz myfile# показва номера на редове

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

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

$изхвърленxyz>myfile1
$изхвърлен xyz nxzz nXYZ>myfile2
$изхвърлен xxx nyyy>myfile3
$коткаmyfile1
$коткаmyfile2
$коткаmyfile3

Търсете в няколко файла

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

$захващане -интегрална схемаxyz myfile myfile1 myfile2 myfile3
$захващане xyz моя*
# съответстващи имена на файлове, започващи с „my“

Упражнение I.

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

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

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

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

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

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

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

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

Примери

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

$захващане„^Xyz“ myfile

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

$захващане„Xyz $“ myfile

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

$захващане„^Xyz $“ myfile

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

$захващане„^X.z“ myfile

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

$захващане‘^Xy*z ’myfile

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

$захващане‘^ X.*z ’myfile

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

$захващане‘^ X *z ’myfile

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

$захващане'\' myfile

Израз grep - egrep

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

  • позволява пълното използване на всички регулярни изрази
  • може едновременно да търси повече от един израз

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

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

$псевдоним егреп='egrep --color'

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

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

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

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

$захващане '(^корен |^uucp |^поща)' /и т.н./passwd

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

$захващане '(^корен |^uucp |^поща)' /и т.н./passwd

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

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

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

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

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

$ls -на /и т.н.|захващане‘^D’|Повече ▼

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

$пс -еф|захващанеcron

$Кой|захващанеkdm

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

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

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

Личен J.Smith 25000
Личен E.Smith 25400
Обучение A.Brown 27500
Обучение C.Browen 23400
(Администратор) R.Bron 30500
Goodsout T.Smyth 30000
Личен Ф. Джоунс 25000
обучение* C.Evans 25500
Goodsout W.Pope 30400
Приземен етаж T.Smythe 30500
Личен J.Maler 33000

Упражнение II

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

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

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

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

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

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

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

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

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

$егреп‘Xxz|xzz 'myfile

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

$егреп‘^ X(Yz|yz)“Myfile

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

$егреп‘^ X[Да]z ’myfile

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

$егреп‘^ X[^ Да]z ’myfile

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

$егреп‘^Xy*z ’myfile

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

$егреп‘^Xy+z’ myfile

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

$егреп‘^Xy? Z’ myfile

Упражнение III

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

Още примери

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

$егреп‘^Xy.*z ’myfile

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

$егреп‘^Xy{3}z ’myfile
$егреп‘^Xy{4}z ’myfile

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

$егреп‘^Xy{3,}z ’myfile

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

$егреп‘^Xy{2,3}z ’myfile

Заключение

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

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

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

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

Упражнение I.

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

захващане -° Скъдето/и т.н./passwd

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

захващане -cvкъдето/и т.н./passwd

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

Упражнение II

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

Упражнение III

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

$егреп ' (Администратор )'хора

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

$егреп ' (Администратор ) | *'хора