Введение в Unix

Поиск строк в файле по образцу (grep)


Утилита grep осуществляет поиск по одному или нескольким файлам и печатает все строки, содержащие предъявленный образец текста, на стандартном выводе.

В простейшем случае образец задается постоянной строкой знаков. В общем же случае он задается регулярным выражением (grep - акроним от global regular expression printer).

Пример:

$ grep Henry admpeople hardpeople softpeople Softpeople: Henry Morgan 112 $ или

$ grep Henry *people Softpeople: Henry Morgan 112 $

Ключ -v (invert) предписывает печать всех строк, кроме найденных, например:

$ grep -v "Henry Morgan" Softpeople Bill Williams 100 Mary Clark 101 $

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

Регулярные выражения позволяют вести поиск типа: найти все слова из четырех букв, начинающиеся на d, или все слова, кончающиеся на able, и тому подобное. Рассмотрим примеры задания образцов посредством регулярных выражений.

Знаки ^ и $ помечают начало и конец строки соответственно:

"^Genesis" - найти все строки, начинающиеся словом Genesis;

"eschatus$" - найти все строки, кончающиеся словом eschatus;

"^Out in cold$" - найти все строки, равные образцу.

Точка помечает любую букву:

"d..." - найти все слова из 4 букв, начинающиеся с d;

"d...$" - то же в конце строки;

"d..\ ." - найти все слова из 4 букв, начинающиеся с d и оканчивающиеся точкой



(знак \ - обратный слэш - отменяет специальное значение следующего символа).

Квадратные скобы задают возможные значения знака:




"^ [abcxyz]" - найти все строки, начинающиеся с букв a,b,c,x,y или z;

"[^Dd][a-z][a-z][a-z]" - найти все слова из 4 букв, не начинающиеся с D или d, в которых последние три буквы - малые (от a до z).

Фигурные скобки задают количество повторений (замыкание) предыдущего знака:

"[^Dd][a-z]{3}" - то же самое, что и предыдущий пример;

"[a-z]{3,5}" - найти все слова, содержащие от 3 до 5 малых букв.

Частные случаи замыкания обозначаются специальным образом:

* для {0} - ноль и более раз;

+ для {1} - один и более раз;

? для {0,1} - ноль или один раз.

Например:

$ grep ".*" people - просто напечатает все строки файла.

Примеры использования регулярных выражений:

уничтожить все пустые строки в файле:

$ grep -v "^ $" file > newfile;

уничтожить все строки, состоящие только из пробелов:

$ grep -v "^ *$" file > newfile.




Содержание раздела