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

Using Grep With Regular Expressions



В этом руководстве описывается, как использовать оба рукоятка (а также egrep) т o находить текст в файлах в его простой форме и в сочетании с регулярными выражениями. Он содержит несколько Примеры а также упражнения , более решения , чтобы зритель закончил.

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







Обычный Выражения

Утилиты позволяют пользователю искать в текстовых файлах строки, соответствующие регулярному выражению ( регулярное выражение ). Регулярное выражение - это строка поиска, состоящая из текста и одного или нескольких специальных символов из 11. Простой пример - сопоставление начала строки.



Образец файла

Основная форма рукоятка может использоваться для поиска простого текста в определенном файле или файлах. Чтобы попробовать примеры, сначала создайте файл образца.



С помощью редактора, такого как nano или vim, скопируйте приведенный ниже текст в файл с именем мой файл .





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

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

Прежде чем пробовать примеры, просмотрите образец файла:



$Котмой файл

Простой поиск

Чтобы найти текст «xyz» в файле, выполните следующее:

$рукояткаxyz myfile

Использование цветов

Для отображения цветов используйте –color (двойной дефис) или просто создайте псевдоним. Например:

$рукоятка --цветxyz myfile

или

$псевдоним рукоятказнак равнорукоятка--цвет'
$рукояткаxyz myfile

Параметры

Общие параметры, используемые с рукоятка команда включает:

  • -я найду все строки независимо дела
  • -c считать сколько строк содержит текст
  • -n строка отображения числа совпадающих строк
  • -l только отображение файл имена тот матч
  • рекурсивный поиск подкаталогов
  • -v найти все строки НЕТ содержащий текст

Например:

$рукоятка xyz myfile# найти текст независимо от регистра

$рукоятка -ICxyz myfile# подсчитываем строки с текстом

$рукоятка xyz myfile# показать номера строк

Создать несколько файлов

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

$выбросилxyz>myfile1
$выбросил -А такжеxyz nxzz nXYZ>myfile2
$выбросил -А такжеххх нггг>myfile3
$Котmyfile1
$Котmyfile2
$Котmyfile3

Искать в нескольких файлах

Для поиска в нескольких файлах с использованием имен файлов или подстановочного знака введите:

$рукоятка -ICxyz myfile myfile1 myfile2 myfile3
$рукоятка xyz мой*
# совпадение с именами файлов, начинающимися с 'my'

Упражнение I

  1. Сначала посчитайте, сколько строк в файле / etc / 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

Чтобы найти символ , используйте:

$рукоятка'\' мой файл

Выражение grep - egrep

В рукоятка команда поддерживает только подмножество доступных регулярных выражений. Однако команда egrep:

  • позволяет в полной мере использовать все регулярные выражения
  • может одновременно искать более одного выражения

Обратите внимание, что выражения должны быть заключены в пару кавычек.

Чтобы использовать цвета, используйте –color или снова создайте псевдоним:

$псевдоним egrepзнак равно'egrep --color'

Чтобы найти более одного регулярное выражение то egrep Команда может быть записана в несколько строк. Однако это также можно сделать с помощью следующих специальных символов:

| Чередование того или другого
(…) Логическая группировка части выражения
$egrep '(^ корень | ^ uucp | ^ mail)' /так далее/пароль

При этом из файла извлекаются строки, начинающиеся с root, uucp или mail, | символ, обозначающий любой из вариантов.

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

$рукоятка '(^ корень | ^ uucp | ^ mail)' /так далее/пароль

Однако в большинстве систем Linux команда grep -E то же самое, что и использование egrep :

$рукоятка -А ТАКЖЕ '(^ корень | ^ uucp | ^ mail)' /так далее/пароль

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

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

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

В следующем примере стандартный вывод из ls -l передается как стандартный ввод в рукоятка команда. Выход из рукоятка затем передается в качестве входных данных в более команда.

Это отобразит только каталоги в /так далее :

$ls - /так далее|рукоятка‘^ D’|более

Следующие команды являются примерами использования фильтров:

$пс -ef|рукояткаcron

$кто|рукояткаkdm

Образец файла

Чтобы попробовать это упражнение, сначала создайте следующий образец файла.

С помощью редактора, такого как nano или vim, скопируйте приведенный ниже текст в файл с именем люди:

Личный Дж. Смит 25000
Персональный E.Smith 25400
Тренинг A.Brown 27500
Тренинг C.Browen 23400
(Админ) R.Bron 30500
Гудсоут Т.Смит 30000
Личный Ф.Джонс 25000
обучение * C.Evans 25500
Гудсоут W.Pope 30400
Первый этаж Т.Смайт 30500
Персонал J.Maler 33000

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

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

Решения для упражнений можно найти в конце этой статьи.

Больше регулярных выражений

Регулярное выражение можно рассматривать как подстановочные знаки на стероидах.

Есть одиннадцать символов со специальными значениями: открывающая и закрывающая квадратные скобки [], обратная косая черта , каретка ^, знак доллара $, точка или точка., Вертикальная черта или вертикальная черта |, вопросительный знак?, звездочка или звездочка *, знак плюса + и открывающая и закрывающая круглые скобки {}. Эти специальные символы также часто называют метасимволами.

Вот полный набор специальных символов:

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

Версия по умолчанию рукоятка имеет только ограниченную поддержку регулярных выражений. Чтобы все следующие примеры работали, используйте egrep вместо этого или grep -E .

Чтобы найти линии с помощью | чтобы соответствовать любому выражению:

$egrep‘Xxz|xzz ’myfile

Чтобы найти строки, используя | чтобы соответствовать любому выражению в строке, также используйте ():

$egrep‘^ X(Yz|yz)' мой файл

Чтобы найти строки с помощью [], соответствующие любому символу:

$egrep‘^ X[Yy]z ’myfile

Чтобы найти строки с помощью [], НЕ совпадающие ни с одним символом:

$egrep‘^ X[^ Yy]z ’myfile

Чтобы найти строки, использующие * для соответствия 0 или более из предыдущего выражения:

$egrep‘^ Xy*z ’myfile

Чтобы найти строки с помощью +, соответствующие одному или нескольким предыдущим выражениям:

$egrep‘^ Xy + z’ мой файл

Чтобы найти строки с помощью? чтобы соответствовать 0 или 1 в предыдущем выражении:

$egrep‘^ Xy? Z’ myfile

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

  1. Найдите все строки, содержащие имена Эванс или художник в файле люди.
  2. Найдите все строки, содержащие имена Смит, Смит или Смайт в файле люди.
  3. Найдите все строки, содержащие имена Браун, Брауэн или Источник в файле люди.Если успеешь:
  4. Найдите строку, содержащую строку (админ), включая скобки, в файле люди.
  5. Найдите в файле people строку, содержащую символ *.
  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

Заключение

В этом уроке мы впервые рассмотрели использование рукоятка в простой форме для поиска текста в файле или в нескольких файлах. Затем мы объединили искомый текст с простыми регулярными выражениями, а затем с более сложными, используя egrep .

Следующие шаги

Я надеюсь, что вы примените полученные здесь знания с пользой. Проверять рукоятка команды над вашими данными и помните, что описанные здесь регулярные выражения могут использоваться в той же форме в мы , sed а также awk !

Решения для упражнений

Упражнение I

Сначала посчитайте, сколько строк в файле / etc / passwd .
$ wc -l /etc/passwd
Теперь найдите все вхождения текста куда в файле / etc / passwd.
$ grep var /etc/passwd
Найдите, сколько строк в файле содержит текст куда

рукоятка -cкуда/так далее/пароль

Найдите, сколько строк НЕ содержат текст куда .

рукоятка -резюмекуда/так далее/пароль

Найдите запись для вашего логина в / etc / passwd файл
grep kdm /etc/passwd

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

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

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

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

$egrep ' (Админ )'люди

Найдите строку, содержащую символ * в файле люди.
$ egrep '*' people
Объедините 5 и 6 выше, чтобы найти оба выражения.

$egrep ' (Админ ) | *'люди