Поиск строк в файле по образцу (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.