Името grep идва от командата ed (и vim) „g / re / p“, което означава глобално търсене на даден регулярен израз и отпечатване (показване) на изхода.
Редовен Изрази
Помощните програми позволяват на потребителя да търси текстови файлове за редове, които съответстват на регулярен израз (регулярно изражение). Регулярният израз е низ за търсене, съставен от текст и един или повече от 11 специални знака. Един прост пример е съвпадение на началото на ред.
Примерен файл
Основната форма на grep може да се използва за намиране на прост текст в определен файл или файлове. За да изпробвате примерите, първо създайте примерния файл.
Използвайте редактор като nano или vim, за да копирате текста по-долу във файл, наречен myfile.
xyzxyzde
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 команда включва:
- -намирам всички редове независимо на случая
- -° С броя колко реда съдържат текста
- -n дисплейна линия числа на съвпадащи линии
- -l показва само файл имена този мач
- -r рекурсивен търсене на поддиректории
- -v намерете всички редове НЕ съдържащ текста
Например:
$ 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
- Първо пребройте колко реда има във файла / etc / passwd.
- Сега намерете всички появявания на текста вар във файла / etc / passwd.
- Намерете колко реда във файла съдържат текста
- Намерете колко реда НЕ съдържат текста вар.
- Намерете записа за вашето влизане в / и т.н. / 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'За да търсите повече от един регулярно изражение на егреп команда може да бъде написана на няколко реда. Това обаче може да се направи и с помощта на тези специални знаци:
| | Редуване, или едното, или другото |
(...) | Логическо групиране на част от израз |
Това извлича редовете, които започват с 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
- Покажете файла хора и разгледайте съдържанието му.
- Намерете всички редове, съдържащи низа Смит във файла хора.Съвет: използвайте командата grep, но не забравяйте, че по подразбиране е чувствителна към малки и големи букви.
- Създайте нов файл, npeople, съдържащ всички редове, започващи с низа Лични в досието на хората.Съвет: използвайте командата grep с>.
- Потвърдете съдържанието на файла npeople, като изброите файла.
- Сега добавете всички редове, където текстът завършва със низа 500 във файла хората към файла npeople.Съвет: използвайте командата grep с >>.
- Отново потвърдете съдържанието на файла npeople, като изброите файла.
- Намерете IP адреса на сървъра, който се съхранява във файла / etc / hosts.Съвет: използвайте командата grep с $ (име на хост)
- Използвайте егреп да извлечете от / и т.н. / 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
- Намерете всички редове, съдържащи имената Евънс или Малер във файла хора.
- Намерете всички редове, съдържащи имената Смит, Смит или Smythe във файла хора.
- Намерете всички редове, съдържащи имената Браун, Браун или Брон във файла хора.Ако имате време:
- Намерете реда, съдържащ низа (администратор), включително скобите, във файла хора.
- Намерете реда, съдържащ символа * във файла хора.
- Комбинирайте 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 -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 '\ *' хора
Комбинирайте 5 и 6 по-горе, за да намерите и двата израза.